-- MySQL dump 10.13  Distrib 8.3.0, for Win64 (x86_64)
--
-- Host: 120.79.93.195    Database: online_blog
-- ------------------------------------------------------
-- Server version	8.0.36

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `blog_article`
--

DROP TABLE IF EXISTS `blog_article`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `blog_article` (
  `id` int NOT NULL AUTO_INCREMENT,
  `article_title` varchar(255) DEFAULT NULL COMMENT '文章标题 不能为空',
  `author_id` int DEFAULT '1' COMMENT '文章作者 不能为空',
  `category_id` int DEFAULT NULL COMMENT '分类id 不能为空',
  `article_content` text COMMENT '文章内容',
  `article_cover` varchar(1234) DEFAULT '	https://mrzym.gitee.io/blogimg/html/rabbit.png' COMMENT '文章缩略图',
  `is_top` int DEFAULT '2' COMMENT '是否置顶 1 置顶 2 取消置顶',
  `status` int DEFAULT '1' COMMENT '文章状态  1 公开 2 私密 3 草稿箱',
  `type` int DEFAULT '1' COMMENT '文章类型 1 原创 2 转载 3 翻译',
  `origin_url` varchar(255) DEFAULT NULL COMMENT '原文链接 是转载或翻译的情况下提供',
  `createdAt` datetime DEFAULT NULL,
  `updatedAt` datetime DEFAULT NULL,
  `view_times` int DEFAULT '0' COMMENT '文章访问次数',
  `article_description` varchar(255) DEFAULT NULL COMMENT '描述信息 不能为空',
  `thumbs_up_times` int DEFAULT '0' COMMENT '文章点赞次数',
  `reading_duration` double DEFAULT '0' COMMENT '文章阅读时长',
  `order` int DEFAULT NULL COMMENT '排序 1 最大 往后越小 用于置顶文章的排序',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=78 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `blog_article`
--

LOCK TABLES `blog_article` WRITE;
/*!40000 ALTER TABLE `blog_article` DISABLE KEYS */;
INSERT INTO `blog_article` (`id`, `article_title`, `author_id`, `category_id`, `article_content`, `article_cover`, `is_top`, `status`, `type`, `origin_url`, `createdAt`, `updatedAt`, `view_times`, `article_description`, `thumbs_up_times`, `reading_duration`, `order`) VALUES (37,'JAVAEE复习',522,5,'1.查看接口或抽象类的实现类ctrl + alt + b\n\n如果代码需要两个死循环同时工作可以选择开两条的线程解决 //一个线程解决一个死循环\n//TCP协议中使用IO流 可以使用BufferWrite()来每次传输一行以换行符作为一次传输过程先.write(inf) 再.newLine()最后.flush()即可 \n1..java原文件->javac编译成.class字节码文件->java再运行.class完成逻辑处理\n\n2.0b为二进制 0x为十六进制 //计算机中都是以补码存在(补码:反码加1 ; 反码:负数的二进制由原来的0变1 , 1变0 (符号位1变0))\n\n3.任意系数转十进制;系数*基数(当前的进制)的权次幂相加\n\n4.一个字节取值为-128(补码为1000 0000)到127(0111 1111)(一个字节八个bit位)\nbyte一个字节 (8个bit)\nshort二个字节\nchar 1个字节\n这三个在隐式转化时会先会转为int类型在进行运算 (默认按照大的字节进行前面补0)\n强制转换:按照低的字节进行强制抹零(得到什么就什么);\nint四个字节\nlong类型八个字节\n\n附加: >>右移 每移一位除2(高位补0) <<左移 每移一位乘2(低位补零)\n\n5.Switch(表达式){\ncase 值1:\n语句体1;\nbreak;\ncase 值2:\n语句体2;\nbreak;  \n....\n}\n\n5.多态使用;Animal cat=new Cat();\n类型转化时可以使用\nif(animal instanceof Cat c) {}//来判断对象是不是后面的类如果是是就转为 Cat c;\n\n6.ctrl+shift+U完成字母的大小写转化\n\n7.final修饰的词为常量不可修改;修饰变量时名字要全部并且大写 用_来间隔单词\n\n8.abstract 抽象类;修饰的方法必须重写否则报错(用于父类使用)\n\n9.接口中,为了在兼容已有实现类中添加新的功能我们可以使用defalt来修饰新方法,可以保证已有类不会报错;(实现类重写时不需要把defalt也加上,(可以不重写直接调用接口方法))\n\n10.System.exit(0); 退出java虚拟机\n\n11.Math.sprt(); 开根号 Math.cbrt();开立方跟 \n\n12.System.arrayCopy();数组拷贝可以用用于数组中元素的对换位置\n\n13.ctrl+b看源码 ctrl+F12看中总方法 \n\n14.克隆类对象用Object中的clone方法类要继承Cloneable并重写clone方法\n\n15.贪婪爬取和非贪婪爬取在正则表达中结尾加上+ 加+?为非贪婪\n\n16.范型 修饰方法放在修饰词后面(可以使用通配符来完成对元素的类型的限定) ?表示任意 \n public static void method (ArrayList<? extends myArrayList> listUtils) {} //集合类型可以是任意但是要继承于myArrayList的元素\n\n17.Stream流 先获取Stream流 单列集合直接.stream()来获取stream流 双列集合先获取keyset再进行过滤 数组Arrays.stream(数组)来获取流 //流上我们直接使用拉姆达表达式完成2代码简化s->{处理数据} //s为流上的数据\n.filter()//过滤 .limit()//获取前几个元素 .skip()//跳过几个元素 .distinct()元素去重(hashcode和equals方法) .concat(stream a,stream b)//合并流 .map//转化流中数据类型\n\n18.方法引用 调用方法类::方法 //引用要满足返回值,形参一一对应,方法可以满足调用\n\n19. 字节流(所有文件都可以读取)inputstream,outputstream //记得释放资源\n19.1 FileOutputStream 最基础的写出字节流,在创建对象,选择要写出的文件时后面可以加上true,完成可续写的写出 fileOutputStream.write(字节数组); //想要完成换行写出可以定义字符串\"/r/n\"再转为字节数组写出即可换行\n19.2 FileInputStream 最基础的写入字节流 .read()为空参时返回值为读取到的byte值 ,没有的话返回-1 .read(byte[])为byte数组时会在读取文件中尽可能把数组填满,返回值为数组中新读到的数据,没有的话返回-1;\n为了防止数组中数据残留 在读取并写入时可以.write(byte[],start,lenth) //byte[]为传输车,start为车中开始索引(0),lenth读到那个索引(//.read的返回值)\n字符流(纯文本文件//windows自带的记事本可正常读取的文件)reader,writer\n\n20.序列化流ObjectInputStream//可以将对象写入文件 我们可以在成员变量前加上transient关键字,可以让该变量在写入时不写入文件.要写入的对象类要实现serializable接口\n\n21.正则表达式 (分组,非分组)\n21.1生成文本匹配器Pattern.compile(String regex);\n21.2选择匹配的文本 compile.matcher(string text);\n21.3循环获取匹配的文本\n\n22.线程池大小;\nCPU密集型运算:最大并行数＋1\nl/O密集型运算:最大并行数 * 期望CPU利用率* 总时间(CPU计算时间+等待时间)/CPU计算时间\n\n23.消息队列 ArrayBlockingQueue<Object> queue = new ArrayBlockingQueue(int capacity //队列长度);\n要确保两个线程公用一个队列才可以完成\n生产者.put(<Object>)放入队列中的数据 //底层判断队列是否满了满了就等待 没有满就放数据\n消费者.take()获取队列中数据  //判断是否有数据有就获取,没有就等待\n两个方法底层有锁\n\n24.线程池底层(消息队列+多线程) 线程池对象.submit(runnable,Task)//使用线程池来完成任务 \n- 创建一个线程池类(ThreadPool)\n- 在该类中定义两个成员变量poolSize(线程池初始化线程的个数) , BlockingQueue<Runnable>(任务容器)\n- 通过构造方法来创建两个线程对象(消费者线程)，并且启动\n- 使用内部类的方式去定义一个线程类(TaskThread),可以提供一个构造方法用来初始化线程名称\n- 两个消费者线程需要不断的从任务容器中获取任务，如果没有任务，则线程处于阻塞状态。\n- 提供一个方法(submit)向任务容器中添加任务\n- 定义测试类进行测试\n\n25.JKD中自定义线程池(ThreadPoolExector)\nThreadPoolExecutor diyPool=new ThreadPoolExecutor(\ncorePoolSize：   核心线程的最大值，不能小于0\nmaximumPoolSize：最大线程数，不能小于等于0，maximumPoolSize >= corePoolSize\nkeepAliveTime：  空闲线程最大存活时间,不能小于0\nunit：           时间单位\nworkQueue：      任务队列，不能为null\nthreadFactory：  创建线程工厂,不能为null\nhandler：        任务的拒绝策略,不能为null);\n\n26.IP4的地址分类\n26.1 公网ip\n26.2 局域网ip //(网吧,公司)一台公网IP 每台电脑共用一个公网IP地址(每台电脑形成局域网)(192.168.开头是私有ip范围是192.168.0.0--192.168.255.255专门为组织机构内部使用，以此节省IP)``\nlocalhost: 127.0.0.1 //本机IP\n//假如现在在局域网中你的ip为192.168.1.100请问你局域网IP和你的localhost是否一样?\n假如没有更换位置,此时我们请求192.168.1.100时首先会向路由器中发送请求信息,再由路由器向192.168.1.100(本机)发送信息,如果我们请求127.0.0.1时,电脑会直接向本机发送信息(不会经过路由器);\n假如换了一个地方192.168.1.100就不一定为本机IP而127.0.0.1永远指向本机.\n\n27.ip地址的cmd命令;\n1.ipconfig 查看本机ip地址\n2.ping ----- IP //查看输入的网址的流畅度;(可以为网站)//此时测试本机是否联网\n\n28.InetAddress.getname()//InetAddress IP地址工具类通过局域网设备名字来获取地址\n\n29.协议//计算机中,连接和通信的规则被称为网路通信协议;\n\n29.1 OSI参考模型(分为七层:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层):\n过于理想化后被(应用层(HTTP,FTP),传输层(TCP,UDP),网络层(IP,ICMP,ARP),物理链路层(硬件设备01010101))四层协议取代.\n其在发送信息时会通过自己七层协议转为二进制信息在发给目的去再通过目的地自身七层转为信息.\n\n29.2.1.UDP是面向无连接通信协议. //不管是否网络连接,直接发. //在线视频,直播,会议(事实更新的,可以丢包不影响大局的事情)\n速度快，有大小限制一次最多发送64K，数据不安全，易丢失数据\n29.2.2.TCP协议是面向连接的通信协议. //取保网络已经连接,再发送信息. //下载软件,文字聊天(不能丢包的事情)\n速度慢，没有大小限制，数据安全。\n\n30.UPD通行流程(DatagramSocket或者MulticastSocket)\n一.发送数据\n1.创建发送端DatagramSocket(int port)对象 端口好可以不写java虚拟机会从可用端口中抽取一个\n2.数据打包(DatagramPacket(btye[] inf,int length,InetAddress,int port))对象 多种构造方法当作为.send()方法使用为传输数据的载体//必写端口好\n3.发送数据.send(DatagramPacket datagramPacket)\n4.释放资源.close()\n二.接受数据\n1.创建接受端DatagramSocket(int port)指定接搜哪个端口号信息\n2.装备载体接受DatagramPacket(byte[] inf,length) //表示为用一个byte数组接受数据,用该数组里多大空间接受数据\n3.接受数据.receive(DatagramPacket datagramPacket) //该方法会阻塞,一直等到有信息接收;\n//有消息时我们可以通过datagramPacket.getdata()来获取数据 以及发送者的.getPort()端口和.getAdress()发送设备 再通过设备.getHostName()获取发送者电脑名字\n4.释放资源.close()\n三.通行方式\n1.单播 //之前写的都是单播\n使用DatagramSocket 发送的就是单播\n2.组播 组播地址: 224.0.0.0-239.255.255.255 其中224.0.0.0-224.0.0.255为预留的组播地址 //指定ip可以收到信息\n使用MulticastSocket发送信息 并在指定ip地址时选择 224.0.0-224.0.0.255中的组播地址 //加入组后可以收到信息\n接受组播数据: 创建MulticastSocket对象 multicastSocket.joinGroup(InetAdress ip)将本机添加到输入的地址,(发送信息的组播地址), \n3.广播 广播地址: 255.255.255.255 //局域网全部设备都可以收到信息\n和单播一样使用DatagramSocket 发送信息 不过在指定ip地址时选择255.255.255.255就可以完成广播\n\n31.TCP通信流程 //1.两端产生一个Socket对象 2.通信前确保连接已经建立 3.通过Socket产生IO流完成网络通信 (三次握手,四次挥手)\n一,发送数据\n1.创建客户端的Socket对象和指定服务端连接 Socket(String host,int port) //确定可以连接,否则报错(底层为三次握手协议确保连接建立)\n2.获取输出流,写数据//socket.getOutputStream();\n3.释放资源 socket.close(); //四次挥手协议(确保连接通道中没有数据之后再进行关流)\nsocket.shutdownInput();关闭输入流,此时服务器端才能结束io流中死循环;(不能以-1作为循环结束条件)\n二,接受数据\n1.创建服务器端的Socket对象(ServerSocket) ServerSocket(int port)\n2.等待连接   serverSocket.accept()监听客户端连接,返回一个Socket对象 //阻塞任务,直到有人连接.\n3.获取输入流，读数据，//socket.getInputStream();\n4.释放资源 serverSocket.close(); inputStream.close();\n\n32.动态代理 (Proxy)//对已有类进行无侵入式代码加强. //我们常常定义一个需要代理的工具类 来获取加强后的类再进行调用加强后的方法\nProxy.newProxyInstance(本类的类加载器,要加强方法的代理接口的类对象(数组),重写该内部类)//获取一个代理对象\n其中重写的内部类方法为代理对象调用加强方法时就调用该重写方法(invoke)而不是原来的老方法\nObject invoke(Object proxy //代理的对象,Method method //执行的方法,Object[] args //传过来的方法实参){\n返回值为方法代理后运行的返回值\n}\n工具类如下\n`````java\npublic class ProxyUnit {\n    public static Show getshow(Start start) //将要加强的对象传来 { //返回值为要加强的接口(多态)(使用时一样调用使用)\n        Class[] classes = {Show.class}; //要加强方法的代理接口的类对象(数组)\n        return (Show) Proxy.newProxyInstance(ProxyUnit.class.getClassLoader(), classes, new InvocationHandler() {\n            @Override\n            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //方法加强\n                if (method.getName().equals(\"sing\")) {\n                    System.out.println(\"收钱\");\n                    System.out.println(\"给牌\");\n                } else if (method.getName().equals(\"dance\")) {\n                    System.out.println(\"看到了有人跳舞\");\n                }\n                return method.invoke(start,args); //运行原方法返回值\n            }\n        });\n    }\n}\n```\n``\n测试类如下\n```java\npublic class Demo3 {\n    public static void main(String[] args) {\n        Start start=new Start(\"IOJAM\");\n        Show getshow = ProxyUnit.getshow(start);\n        getshow.dance();\n        getshow.sing(\"东京不太热\");\n    }\n}\n反射//获取类的class对象 再通过calss对象调用该类的各种方法或者创建该类对象\n注解//当虚拟机看到注解后会完成对应的功能\n元注解 //写在注解上的注解\n@Target(ElementType.TYPE//类上 ElementType.FIELD//成员变量上) //该注解只能写在形参的上面\n@Retention()  //该注解只能在规定的存在(一般不写)默认为CLASS(存在于源码,字节码文件) //要写也写RUNTIME(所有阶段都存在)\n```\n','http://so6b4f8dg.hn-bkt.clouddn.com/Fj34RN4OKUa-v6IRqSZATGcERN2H',2,1,1,NULL,'2024-12-20 15:41:17','2024-12-20 15:59:45',4,'价值不高,重要的也就Stream流和方法引用,很久以前的笔记了原txt格式,',0,81252,NULL),(38,'有彩蛋喵~~~~',522,6,'咦咦咦~~~怎么还看喵~想必这时候你在考研路上,中场休息,亦或是考完了,我真的真的希望你能顺利上岸.如果说喜欢就是想对方开心就自己就会开心,那我应该算喜欢上你了吧,可以选择你爱的人,当然可以不是我啦,嘻嘻我是喜欢你,不知道为什么,是你夸我,我内心的波澜起伏?或者是,你在我CPU过载时为我出面解围,亦或者是眼神交换后的暧昧感,但是鸭没有办法我必须要为以后做打算鸭,说说我大三出社会那年的事情吧,大三下那一学期23/3月份,我想着总得学点东西吧,一开始我还是会去上课,手写代码,嗯白纸黑字那种,但是效率太低了,一节课手写的代码,也就电脑前5分钟搞定,慢慢的我干脆就直接在宿舍学,每天就是代码(也不出门早上八点到晚上十一点都是码代码状态),那段时间我效率贼高,到了六月份吧我就学到应届生的水平(可以做毕业设计了),我那时想着干脆大三退学以纯技术去找工作,也在BOSS直聘把我的情况和上找了本地的几家公司说了发了四家还是五家,有个HR就是老板的人看到我的经历说放假可以去实习,但是没有工资,包吃加通勤,约等于给我机会去企业,嗯我那时就想着吉林这互联网企业少,投了西五家就有实习了,想着直接退学,在家里把前端技术也完善完善,去找个工作那不是轻轻松松吗,抱着这心态我去去到了教务部办理退学,最后以一年休学开启了我进入社会的一年,害现在想想,够天真的,进入社会后,七月份,我觉得不能向家里要钱吧,去我哥那干活(007PS:真一个周工作7天)想着六点下班后自己接着学,但是工作后完全不是这样的,六点下班,洗漱,吃个饭,真正属于自己的时间太少了,外加就我一个人,太累了一开始计划还是把前端学好,攒点钱去找工作,呵呵了,我现在想想觉得好笑.慢慢的我下班后就开始玩玩游戏,到后面你应该猜出来了,这状态到了8月底,手里有的几千块的工资,but!!!!!!!!!这时候我已快两个月没有碰代码了,外加工作让我觉得贼累,外加想到代码我都有点忘记了(3-6月份学的很快(外加刚刚入门计算机,有贼多东西很感兴趣),没有总结,一段时间不碰就会忘记),我颓废了,一个人,一间出租屋,一台电脑,外加游戏上pc了我性格就是那种极端性格,九月份我只觉得这段时间太恐怖了(划重点!!!!),十月份可能是游戏打腻了,亦或者十月去旅游让我从颓废的日子里仿佛看到了不能颓废了,我必须改变了,就有了10月份我重新从最基础的开始重新把之前的进度重新过了一遍(又花了两个月),期间又去我哥那干了一个月吧.时间就稀里糊涂到了过年了,过完年24/年2月份,我面瘫了,不出意外的面瘫了,带状疱疹,以至于现在还是右眼下垂,那段时间我很痛苦,想过死亡,我痛苦我的选择,我的拖沓,我那当初的勇气和锐气,在我一次次堕落中消磨殆尽.24/2月我回到了广东,','http://so6b4f8dg.hn-bkt.clouddn.com/FiUlMpVfyks9KMZ-dHtHn-G6gVsh',2,3,1,NULL,'2024-12-19 16:31:14','2024-12-19 16:31:14',0,'彩蛋喵',0,0,NULL),(39,'加油哟~~~~',522,8,'**相信你肯定可以的,你是最棒的嘻嘻,加油哟~~~~(嘴笨说不出更多鼓励的话了)冲鸭!!!!**\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FlYDHGJb6QHinllf7f3f2JvFnven)\n','http://so6b4f8dg.hn-bkt.clouddn.com/FkkEPFedsJlufhCrHGJjFQASB5rE',2,1,1,NULL,'2024-12-19 16:49:00','2024-12-19 17:18:05',1,'加油哟~~~~',1,11792,NULL),(56,'特别的人',522,9,'**咦咦咦~~~怎么还看喵~想必这时候你在考研路上,中场休息,亦或是考完了,都放松放松紧绷的神经吧,真的真的希望你能顺利上岸,选择自己想要的生活**![](http://so6b4f8dg.hn-bkt.clouddn.com/Fn01pW110bXcWJZfd80cRodzYVKl)\n','http://so6b4f8dg.hn-bkt.clouddn.com/FkkEPFedsJlufhCrHGJjFQASB5rE',2,2,1,NULL,'2024-12-19 17:13:34','2024-12-19 17:15:45',3,'特别的人',0,0,NULL),(58,'前端三剑客',522,7,'HTML,CSS(课之前刷的够多了,只是很久没有用忘记了,评价:花点时间直接看别人的笔记即可,不需要浪费时间了)\nHTMLlink:https://www.zhihu.com/tardis/bd/art/583518241?source_id=1001\n1.a标签:target属性来配置跳转后是否保留原来页面 属性值为\"_blank\" 新的窗口跳转,默认为在当前窗口跳转\n\n2.audio标签:音频标签 属性src 音频url,controls 显示音频控制面板, loop 循环播放;\n\n3.video标签:视频标签 属性src 音频url,controls 显示音频控制面板, muted 静音播放,loop 循环播放; autoplay(必须配合muted一起才生效) 自动播放\n\n4.CSS选择器\n元素选择器 标签{}\n类选择器 .类名{}\nID选择器 #元素id{}\n\n5.行内元素:\n\n6.块元素:\n\n7.盒子模型:\n \n8.JS:对象:\n1.基础对象(如Array,String,RegExp,MATH等) \nArray(类似集合)方法:.push(元素..)添加元素 .forEach(引用函数) 遍历元素调用引用函数 \nString 方法:.length() .trim() 去除首尾的空格 .substring(start,end) 截取字符串\n\n2.宿主对象:浏览器对象模型（BOM）中的Window,Navigator,Screen等,以及文档对象模型(DOM)中的Document,Element\n2.1BOM:\nalart(); confirm();确认弹窗(有返回值(true,false)); 循环定时器:setInterval(function(){},时间毫秒值)//按照时间周期执行 Settimeout(function(){},时间毫秒值)//过多久执行\nlocation.href(url) //跳转到指定的地址\n2.2DOM\n\n\n\n3.自定义对象:(JSON)\nvar 对象名 = {属性名1 : 属性值1,属性名1 : 属性值1,...函数名称: function(形参){}....}\n调用JSON方法. JSON.parse()String字符串转换为JSON对象; JSON.stringify(object) 将json对象转为String\n\n9.引用函数简化:\n原来:function name (形参){方法体} 可简化为 (形参)=>{方法体}\n\n10.vue在方法区使用data区的值时要使用this.data里键名来使用\n笔记:https://blog.csdn.net/qq_45702990/article/details/111052950\n\n','http://so6b4f8dg.hn-bkt.clouddn.com/Fhz3euQCDOgIL-z5RvEPi8pu5PWJ',2,1,1,NULL,'2024-12-20 08:47:48','2024-12-20 08:47:48',21,'前端三剑客',6,0,NULL),(59,'前端框架前置课(ajax,node.js,webpack)',522,7,'1.axios使用:(底层为XMLHttpRequest和事务管理Promise)\n库:<script src=\"https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js\"></script>\n1.get语法:axios({url:\'\',params:{请求参数} }).then(result=>{}) 2.post语法: axios(\'url\':\'\',method:\'\',data:{})\n\n2.form-serialize插件 (npm下载去了,直接js引入懒得找路经)\n导入js后,调用serialize(form表表dom对象,{hash : true,empty : true})即可完成对表单数据的封装\n其中 hash:ture 开为将数据封装为JS对象 关为封装为parms字符串 ; empty为是否收集空值\n\n3.bootstrap(框架后用npm引了)\nCSS:<link href=\"https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css\" rel=\"stylesheet\">\nJS:<script src=\"https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.2.3/js/bootstrap.bundle.min.js\"></script>\n1.弹窗为modal 库中css属性控制弹窗是否显示,再根据自定义属性通过库中js 可以方便控制弹窗行为\n<button type=\"button\" class=\"btn btn-primary\" //控制这个长什么样 data-bs-toggle=\"modal\" //控制类型 data-bs-target=\".mymodal\" //CSS选择器选择控制哪个弹窗(不建议使用id选择器指定) >\njs中通过调用new  bootstrap.Modal(弹窗dom对象).show() / .hide() 即可完成js中对弹窗逻辑处理(类似java中类)\n\n\n二.js\n数组.join(\'xxx\')在每个元素后面添加xxx返回一个元素拼接的string\n数组.map(元素名=>`html代码 ${元素名} html代码`) 完成数组中元素映射为字符串数组中(不需要去遍历手动遍历修改了) !!!! (``这是作为拼接号在哪里都可以使用${}即可在``里面注入值类似mybaits了)\n数组.join(\'\')即可完成把一个string数组中所有元素都变成一个string(这样想:每个元素后面都填加一个\'\'不就成一个了吗)\n数组.contains(\'\') 判断数组是否有该元素\n数组.filter((遍历的元素)=>过滤条件 //返回值为boolean值不可加) 可以用于数组元素删除 list=list.fifter(item=>去除条件 不能加{} )\n数组.find((遍历的元素)=>查找条件) //获取数组的元素 //找到即可直接修改数组元素\ndom对象.addEventListener(\'事件类型\',function)\ndom对象.value 获取dom对象输入框内容\ndom对象.classList 获取dom对象的class数组 可以.add() .remove()\ndom对象.innerText 修改标签内的文本\nstring.replace(正则表达式 /g,\'替换的东西\') 加上/g 为string全部都更换\n表单formDom对象.reset() 清空全部表单列表值\nCSS选择器可以同时输入多个条件\nfileDom元素.files 获取dom对象文件数组(往往索引为0即为目标文件)\nconst fromData= new FromData() //获取表单列表对象   再多次调用 fromData .append(参数名,文件值) 来封装文件值为表单列表对象用于数据传输 直接传输为 data : fromData //一个表单\ndom元素.style.css属性=xxx 对dom元素的css属性赋值\nlocalStorage.setItem(\'bg-url\', bgUrl): 存储数据(存储于Chrome目录下User Data\\Default\\Local Storage) localStorage.getItem()获取存储数据\n判断条件 && 要执行的代码      逻辑与的短路来进行简化if条件判断\n\n事件委托:想获取动态的元素的dom对象添加事件监听: 通过不影响的父级dom对象的事件对象来.target获取发生的事件的子元素dom对象 \n解决动态的子元素存储id信息: 通过 data-存储名=xxx  进行赋值即可,再通过该dom元素.dataset.存储名获取即可 或者该dom元素和兄弟dom元素都需要用到相同数据 可以定义到同一父级再通过 dom元素.parentNode.dataSet.存储名\n\n使用async和await :解决回调函数地域(回调函数里写回调函数) 可以通过try {}catch(error){}\nasync function test(){\nconst result =await axios({}) //获取回调函数返回值的对象 ...\nconst result =await axios({}) //获取回调函数返回值的对象 \n}\n\n由于js是单线程,在运行到异步函数会将(异步函数交给浏览器运行),运行完代码最后运行异步函数的回调函数\n\nNODE.JS(前端工程化:(压缩文件,部署环境,模块化开发))\n区别:Node.js环境中没有BOM和DOM\n\nfs模块(类似插件封装了方法和属性,该模块封装本机系统进行交互) 使用require()函数创建对象 ;读写文件IO流 格式:\nconst fsdemo = require (\'模块名\')  \nfsdemo.writerFile(\'文件路径\',\'写入的内容\',执行后的回调函数(err)=>{//成功err为空})\nfsdemo.readFile(\'文件路径\',执行后的回调函数(err,data)=>{//成功err为空,data为16字节的输入流}, 调用.tostring() 即可将byte转string)\n\nnodejs 运行时目录并不是当前文件而是运行终端的目录上所以js中使用相对路径会产生问题,再使用建议使用绝对路径;\npath模块(解决路径获取问题)\nconst pathdemo = require(\'path\')  调用pathdemo.join(\'路径1\',\'路径2\'...)会按当前操作系统来进行拼接路径  __dirname (两个_)//node中的内置变量 变量值为:当前模块目录的绝对路径\nconst pathdemo = path.join(__dirname, \'static\',\'demo.txt\')\n\nhttp模块(服务器)\n代码如下:\nconst http = require(\'http\') //导模块\nconst service = http.createServer() //造服务器\nconst fs = require(\'fs\') //导入文件io对象\nservice.listen(3000,()=>{ //服务器端口号\n    console.log(\'服务器启动\');})\nservice.on(\'request\' //事件监听:, (req, res) => { //服务器开启,事件回调函数\nconsole.log(req.url);\n    if (req.url === \'/demo.html\') { //判断url\n        fs.readFile(\'./static/dmeo.html\', (err, data) => {\n            if (err) console.log(err)\n            else {\n                res.setHeader(\'Content-Type\', \'text/html;charset=utf-8\')\n                res.end(data.toString())\n                console.log(\'响应成功\');\n            }\n        })\n    }else{\n        res.setHeader(\'Content-Type\', \'text/html;charset=utf-8\')\n        res.end(\"路径不存在\")\n        console.log(\'响应成功\');\n    }\n})\n\nnodejs 模块化开发\n自定义模块\n1.commonjs导出\n导出 : module.exports={对外的属性名: 模块中属性名,对外的属性名: 模块中属性名,...} //以json对象格式导出\n导入: require(\'模块名//只能是内置模块 或者 路径//自定义模块的路径\')  导入后直接.属性名使用即可 \n\n2.ECMAScript语法导出\n先开启ECMAScript语法支持;在js包下创建package.json文件 定义{ \"type\":\"module\"} 配置nodejs的运行语法支持\n2.1基础导出入\n导出: export default {对外的属性名: 模块中属性名,对外的属性名: 模块中属性名,...}\n导入: import 对象名 from \'模块名或者路径\'\n2.2命名导出入\n导出: export const 变量名 = \'\' \n导入: import {导出中定义的变量名} from \'模块名或者路径\'\n\nnodejs 包的概念 //模块，代码，其他资料聚合成一个文件夹\n根目录中，必须有package.json文件（记录包的清单信息)\n项目包:主要用于编写项目和业务逻辑\n软件包:封装工具和方法进行使用\n{\n    \"name\": \"cz_utils\", \n    \"version\": \"1.0.0\", \n    \"description\": \"一个数组和字符串常用工具方法的包\", \n    \"main\": \"index.js\",    \n    \"author\": \"itheima\", \n    \"license\": \"MIT\" \n}\n导入软件包时，引入的默认是index.js模块文件(将包中模块导入后统一导出 //使用者直接导入这个文件即可)/ main属性指定的模块文件\n使用导入函数时如果传的路径是个包会自动导入包中index.js文件,如果没有回去package.json找main指定的路径\n\nnpm nodejs标准的软件包管理器(下崽管理器)\n1.创建新的项目 (npm init -y 创建package.json文件 //项目有package.json文件跳过)\n2.下载软件包 (npm i(i是install 缩写) 软件包名 (会产生package.lock.json文件用于管理软件包版本)) 下载到项目根目录的node_modules包下\n3.使用软件包\n下载所有依赖: package.json中通过depenceies:{\'软件名\':\'版本\',....} 即可配置依赖包,导入别人项目缺少依赖时通过 npm i 即可完成自动下载\n\nnpm 全局软件包 本机所有项目使用,存在于系统设置的位置\nnodemon 替代node命令.检查代码更新,自动重启查询,封装命令和工具,\n安装: npm i nodemon -g(表示安装到全局环境中)\nnpm 删除包\nnpm uni 软件包名 (-g)\n\nWebPack项目打包\n1.配置环境:  npm i webpack webpack-cli --save dev\n2.package.json 中编写启动脚本(scripts里) \"bulid\":\"webpack\" 配置打包命令\n3.运行自定义命令进行打包 npm run bulid\n//webpack配置: 根目录创建webpack.config.js 来配置打包入口和打包后文件位置\n\n\n当你使用 innerHTML 属性重新设置 DOM 元素的内容时，之前绑定到这些元素的事件处理程序会丢失。新的 HTML 字符串解析并插入到 DOM 中，这将创建新的 DOM 元素，而不是保留之前的元素及其事件处理程序\n\n用浏览器快速获取页面中某个组件原html代码\n用浏览器快速获取网页响应值的路径 :选择要获取的值,右键选择复制路径即可\n在公共js中可以配置axios.defaults.baseURL = \"baseURL\" axios的请求的基地址 配置后地址组成为baseURL + url\n项目存放: lib 放js包 assets 放静态资源 page 放静态网页 utils 放公共js代码 \naxios中存放信息到请求头  (headers:{Authorization :  `Bearer ${localStorage.getItem(\'token\')}`}) 可以使用拦截器进行加强\naxios.interceptors.request.use((config) => { //获取拦截到的请求\n    const token = localStorage.getItem(\'token\') \n    token && (config.headers.Authorization = `Bearer ${token}`) //拦截器中token值\n    return config\n})\naxios响应拦截器: 对响应的请求做统一拦截 : (如果,token值异常就进行重新登入)\naxios.interceptors.response.use((response) => { //获取拦截到的响应\n    if(respose){\nlocation.href = \'\' \nlocalStorage.removeItem()\n}\n    token && (config.headers.Authorization = `Bearer ${token}`) //拦截器中token值\n    return config\n})\n(localStoorage.setItem(\'token\') 即可设置token到本地 )\n在每个需要登入的页面引入定义判断是否有token的js文件,没有则跳到登入页面 (重定向:location.href = \'../page/login/login.html\')\n\n\n\n\n\n\n\n\n','http://so6b4f8dg.hn-bkt.clouddn.com/FpbkNiJLQhxqtJT-y5q5DKBteSAk',2,1,1,NULL,'2024-12-20 08:50:12','2024-12-20 08:50:12',21,'前端框架前置课(axios,node.js,webpack)',6,0,NULL),(60,'vue.js',522,7,'0.在进行同步发送大量请求时可以设置函数防抖(记得不仅要设置定时器还要清除上一个定时器) )\n触发方法时定个时任务发送请求(每次请求前都clearTimeout(定时器id)先前面的定时任务清除 //一段时间内没有在触发方法在进行发送一次请求\n\n\n1.常见事件\nonclick 	鼠标单击事件\nonblur 	元素失去焦点\nonfocus 	元素获得焦点\nonload	某个页面或图像被完成加载\nonsubmit	当表单提交时触发该事件\nonkeydown 某个键盘的键被按下\nonmouseover 鼠标被移到某元素之上\nonmouseout 鼠标从某元素移开\nonload	当页面加载完成后运行\n\n2.Vue常用指令\nv-bind	为HTML标签绑定属性值，如设置href , css样式等\nv-model	在表单元素上创建双向数据绑定\nv-on	为HTML标签绑定事件\nv-if,v-else-if,v-else 条件性的渲染某元素，判定为true时渲染,否则不渲染\nv-show	根据条件展示某元素，区别在于切换的是display属性的值\nv-for	列表渲染，遍历容器的元素或者对象的属性\n\n3.Vue生命周期 :生命周期的八个阶段:每触发一个生命周期事件，会自动执行一个生命周期方法(钩子)。\n状态               阶段周期\nbeforecreate    	创建前\ncreated		创建后\nbeforeMount	挂载前\nmounted		挂载完成\nbeforeUpdate	更新前\nupdated		更新后\nbeforeDestroy	销毁前\ndestroyed		销毁后\n\n4.Vue的使用\n1.cmd \n2.vue ui  \n3.创建.vue文件(三大标签) (vscode运行vue的脚手架时需要在vue项目中随便打开一个json文件后会出现NPM脚本点对应的路径下的serve即可)\n4.再需要的地方进行以该Vue文件的名字为标签的方法导入进来\n5.vue路由(先npm install vue-router@3.5.1)再在router包中的index.js中的routes数组中添加需要添加的路由组件\n6.底层中 main.js中已经自动的import router from \'./router\' //所以我们可以再需要资源跳转时添加<router-link to=\"/dept\">部门管理</router-link> \n//把它当做一个a标签来用就ok了 <router-link>标签中的to属性为路由中写的路径\n7.我们将要显示的地方加上<router-view></router-view>//显示路由中的vue组件 完成页面跳转 //不需要通过其他vue文件名标签的方式来导入vue组件\n如果路由中没有定义\"/\"的path时加载页面时会一片空白(因为此时path\"/\"在App.vue中的<router-view></router-view>路由中没有路由可以匹配改路径)\n我们可以通过重定项来解决 //将地址\'/\'指向\'/dept\'即可\n{\n    path: \'/\',\n    redirect:\'/dept\'\n    }\n副;\nvue中使用第三方js,需要通过npm 来完成下载,如;npm install axios; 再在需要使用的vue文件中 script标签内手动import ;如 improt axios from \'axios\';\n\nVue的打包(vscode中NPM脚本中bulid即可打包)和部署(nginx)\nnginx:(前端的tomcat)\n打包后在项目根目录产生一个dist文件夹再将dist文件夹中所有文件复制到nginx中html中即可\n\n\n1.{{ }} 插值表达式用于标签的文本 (dom.innerText)			{{定义名}}\n2. v-html 在标签中指定innerHTML值 (dom.innerHTML)  		 v-html = \"data中的定义名\"\n3. v-bind 或者 : 标签的属性来绑定 用法				 v-bind + 属性名 = \'data中的定义名\'\n4.v-show 条件 进行条件显示 (加dispaly : none) 频繁切换显示隐藏(性能高)	 v-show = \'条件\'\n5.v-if 条件 进行条件渲染 (不进行渲染) 不进行切换显示隐藏 (省点内存) v-elseif /v-else 配合v-if进行多条件判断\n6.v-on 或者@进行事件绑定用法//@keyup.\'键盘名\'(对应键(enter回车键)按下触发)				v-on或者@  +标签事件 = \"事件名(形参)\" (形参) 可以传可不传\n@keyup.\'键盘名\'(对应键(enter回车键)按下触发) 该方法为指令修饰; 在按键按下后会进行判断是对应键则执行\n7.v-for 将指定标签进行多次循环渲染;				 v-for=\"(item,index) in 数组\" \n底层会根据数组数据进行遍历渲染, 数组元素item和index暂时加入到data集合在哪里就从data集合中取即可\n8.v-model 双向数据绑定(表单)(会根据input类型自动获取其值)  		v-model=\"双向绑定的数据名\"\n\n9.其他指令修饰;\n1.@keyup.\'键盘名\'(对应键(enter回车键)按下触发) 该方法为指令修饰; 在按键按下后会进行判断是对应键则执行\n2.v-model.trim //首尾去空格  .number转数字\n\n10. v-bind 绑定css属性  \n1. :class=\"{css属性 : Boolean类型,....}\" //boolean类型控制增删该属性\n2. :style=\"{ css属性 : 值}\" //设置css属性\n\n11.计算属性\n先在computed 中配置项声明再像普通属性一样使用\ncomputed:{\n计算属性名(){\n处理数据\nreturn 结果\n},....}\n\n12.watch侦听器（配置数组) 作用:监视数据变化，执行一些业务逻辑或异步操作\nwatch:{\n要监听的数据属性名 (newvalue //输入的新值, oldvalue //之前的老值){\n业务逻辑代码},...\n}\n要监听的数据为对象的属性值时需要使用 \' 对象.属性名 \' 设置监听值\n要监听的数据为对象全属性 需要在配中添加 deep:true  //进行深度监测 并且不可简写;完整版代码: 一旦属性改变执行hander方法\n数据属性名:{\ndeep: true , \nhandler (newvalue,oldvalue){\n业务代码\n}}\n\n13.vue生命周期:(created //加载数据,mounted //渲染后,update,destory //不常用, 还有四个:beforeCreate....) //注意可以在created中异步请求过慢导致在mounted过程中数据没有被访问到可以设置计时器进行等待\n\n14.Vue不方便直接放到data配置中,想在跨方法掉用可以将属性挂载this中即可 使用:this.属性名 =定义的属性','http://so6b4f8dg.hn-bkt.clouddn.com/FsNjqvHRLqLqUu-y74tElj7n8bco',2,1,1,NULL,'2024-12-20 08:51:13','2024-12-20 15:52:10',21,'vue.js',6,0,NULL),(61,'vue2',522,7,'路由守卫:\n异步请求(axios)中如果不使用aysnc , await 调用请求方法会得到Promise对象我们需要.then(回调函数)来解析promise后才可以获取其响应数据所有一定要直接在异步加上async await完事!!!\n总结Vue 一切皆数据 (开发切忌不要组件套用孙子组件的数据//都在父组件中声明数据不要孙子从父这拿数据) \n操作vuex时不要只想着把数据拿到组件后在组件中修改,要在vuex中修改,通过vuex中修改和getter逻辑获取!!!!!切记一切皆数据,该数据来源于通用数据!!!!!!\n(循序渐进开发先拆分大的再拆大里面的小的)\n解决一上来就将所有的组件都加载: 异步组件:访问加载解析这个路由对应的所有组件(改一下路由导入) \n配置:LInk:https://router.vuejs.org/zh/guide/advanced/lazy-loading.html#%E4%BD%BF%E7%94%A8-webpack\n\n开发中都组件开发!!细化包括表格分列(使用命名插值插值来自定义组件开发!!!!不要在组件中用vfor这样写死了要用命名插值,循环插值)....\n\n<二>Vue2框架开发 (vue2中 每个vue中只能有一个div根标签,可以包括,不能平级)\n1.组件化开发: \n分为局部注册和全局注册\n局部注册:  导入对应模块后在声明componts:{\'组件名\':组件对象} //相同可简写(约定 : 都是用大驼峰命名法//组件名为vue文件名)\n全局注册:  在main.js中 导入对象模块后, 调用Vue.component(\'组件名\',组件对象) 即可又不是对象属性,不可进行简写\n怎么使用? 直接将组件名当成标签使用即可!!!!!! \n在vscode中 直接在 componts:{} 中输入声明vue文件的名字后即可完成自动导入模块\n在组件开发中vue的根标签往往指定一个 项目名-功能名 的类名(避免组件重名情况)\nvue文件中 export default {//用于导出 data methods computed watch 生命周期钩子....  再别的vue文件中导入后会即可使用导出的模块了}\nvue中style默认为全局css生效 可以在style标签中添加scoped 设计为当前组件生效\nvue中data 是一个函数: 目的每次执行都进行独立的数据对象\n\n2.组件通信: //总结谁的数据谁改\n父子关系 props(父传子) 和 $emit(子传父)  //prop 为组件的自定义属性 子元素无法修改该值(因为该值是和父元素绑定的), 但是可以通过通知来进行修改\n父组件中通过 <子组件名  \'属性名\' : 值 ></子组件名> 子通过props:[\'属性名\'] 接收数据\n子组件中this.$emit(\"事件名\",\"修改的参数\")  \n非父子关系 eventbus\n跨层级数据共享 provide & inject  \n上层中配置 provide(){\nreturn{ 数据名:导出的数据 }  //注意导出的数据为简单类型 为非响应式数据, 而复杂类型则为响应式\n}\n下层中\n配置  inject:[] 接受数据即可\n通法:Vuex\n\nref 和 $refs 来获取dom元素或者组件实例 (必须在dom元素渲染之后获取)\n使用: 在标签属性内加上refs=\"调用名\"  在需要使用dom元素的时候this.$refs.调用名即可完成\n\n自定义指令:使用时 v- + 自定义指令名 [=\"指定方法中binding的值\"]\n全局声明: main.js中配置 \nVue.directive(\'focus\' //指令名,{\n\"inserted\"(el,binding){ //形参为操作的标签元素 //inserted方法为元素被加载时触发 //binging.vaule为使用指令后指定的值\n业务逻辑\n}\n})\n局部声明:\ndirectives: {\n    指令名: {\ninserted(el,binding){  //另外一个update为binding属性值更改时重新加载元素\n  el.stylecolor = \"red\" //业务逻辑\n}\n    },\n  },\n\n自定义指令操作加载动画\n我们可以定义css类 中\n.loading{\n  width: 100%;\n  height: 100%;\n  background: white url(\"./loading.gif\") no-repeat center;\n}\n在需要加载的动画的地方添加该类, 我们通过自定义指令操作类(binding绑定是否加载的开关即可完成获取是否加载动画)\n\n插槽:让组件内部的一些结构支持自定义修改来完成组件的复用!!!!\n1.在组件需要自定义的部分使用<slot></slot>站位\n2.使用时在组件的标签内部填充即可,填充后会将内容插到slot中\n注意在<slot>标签中写内容时当引用该组件标签没有填充时会把<slot>标签的内容当做默认值\n具名插槽:\n组件想在多个slot标签中进行自定义直接在slot标签中添加name属性指定slot名字即可\n引用组件时,在标签中<template #slot名字></template> 即可完成多自定义\n如果想要在插槽传值可以在slot中自定义属性传值, 调用者在<template>标签中:   #slot名=值对象 //会将slot传的所有自定义属性封装为对象  使用直接调对象即可\n\nVue路由\n1.下载路由模块   import导入模块后(Vue模块也要导入)  注册路由Vue.use(VueRouter)  创建路由对象const router =new VueRouter({routes:[]}) 最后挂载到Vue对象上即可\n2.创建组件(将路由用到的vue文件推荐放到Views目录下而不是Compontents),\n配置路由对象的routes数组中配置[{path:\'/路径\',component:\'Vue组件\'}.....]\n最后在需要使用的地方<Router-View   >标签来完成展示路由内容 使用资源跳转即可完成切换不同路由\n组件分类:页面组件(views目录)和复用组件(components目录) 本质毫无区别 为了方便维护\n为了解决所有js配置都写在main.js 我们可以将路由配置写到Router包下index.js中 最后在main.js 导入即可 (在导入模块式路径可以通过@来表示src根目录下 如:\'@/Views/Test/MyView\' //src目录下Test包里的MyView组件) \n解决资源跳转使用<Router-link   to=\"路由路径\">底层在渲染时会转为啊标签 <a herf=\"#路由路径\" class=\"router-link-exact-active router-link-active\">  当位于该路由时会自动添加router-link-exact-active router-link-active这两类\n我即可通过这类 来css样式对当前路由标签进行渲染\n3.子路由:在路由数组中children:[{ //配置二级路由 (同理在路由中再使用<Router-view>标签展示子路由)\n      path:\'\',component: \n    }]\n\n2.声明式导航 跳转传参:\n目标: 在跳转路由时,进行传值 \n路径传参1.直接在路径后面通过 ?参数名=值&....  格式传参; 对应网页通过$route.query.参数名来接收传递的值  //用于多个参数 \n动态路由传参 1.在配置路由路径时 在后面加上/:匹配名[?] 在使用路由时通过路径/值 来传值 , \n对应网页通过$route.params.匹配名来获取值 //用于单个参数   路径添加? 表示该匹配名可以加可不加\n\n3.路由重定向在路由配置数组中添加{ path: \'/\', redirect:\'/home\' },即可\n404页面:在数组最后面配置{path:\'*\',component:\'组件\'}\n\n4.Js跳转: this.$router.push{path:\'路径\',query:{\n传的参数 .... \n}或者params:{}\n}\n\nvue缓存插件:keep-alive 当它包裹动态组件时会缓存不活动的组件实例,而不是销毁它们.keep-alive是一个抽象组件:它自身不会渲染成一个DOM元素，也不会出现在父组件链中。\n缓存到运存中用于缓存的经常切换的路由\n:将<keep-alive>包裹的路由进行缓存 可以通过Include:[组件名...] 来选择路由中内可以缓存的组件\n当组件缓存后再次打开就不会进行created() mouted()周期 为了解决这问题 在组件被缓存后会添加两个新周期:\nactivated(){//当组件重新激活}, deactivated(){}\n\nVueX状态管理工具:多组件的通用数据交互类似IOC容器了\n1.在vuex仓库  state: {  },定义数据后可以通过store.state.xxx来获取数据了\n解决每次掉用仓库值都要store.state.xxx获取,可以通过import {mapstate} from \'vuex\' \n导入后直接在computed中命名从仓库中拉去的数据 computed: { ...mapState([\'name\'])  }\n\n2.同步修改值: 在仓库中 mutations: {方法名(state,形参){},)},配置修改值的方法即可 使用时通过this.$store.commit(\'定义方法名\',形参) 形参为多个时不可以很多次传递 需要传递封装为一个对象;\n\n3.异步修改值:在仓库中 actions:{ 异步修改方法名(context, 形参){ (context.commit(\'同步方法\'))} } //方法内调用同步修改值方法, 外部通过调用this.$store.dispatch(\'异步方法名\',形参)\n\n4.仓库中计算属性getters:   getters:{属性名(state){逻辑处理}} 外部通过$store.getters.属性名即可完成获取\n\n5.vuex模块将根仓库进行拆分到store/modules/xxx.js定义好export default{namespaced:ture 对应内容后导出}  后再在根仓库中导入模块即可\n\n前端swagger:json-server\n\n\n前端开发思路:\n1. 分析页面,按模块拆分组件 \n创建对应的组件vue文件,在根组件中一次性快捷导入组件,框架OK之后直接去开发对应的模块即可 \n2.根据设计图,编写html结构,css样式\n3.拆分封装通用小组件\n项目目录中utils自定义js工具类\n\n1.vant-ui组件库(移动端组件库)!!!Link: https://vant-contrib.gitee.io/vant/v2/#/zh-CN/quickstart#tong-guo-cdn-an-zhuang\n解决vantui手动引入时对main.js占用太大位置 可以在utils中定义vant-ui.js main.js导入即可\n\n2.vx(移动端显示适配)插件:postvx   LInk:https://github.com/evrone/postcss-px-to-viewport/blob/master/README_CN.md\n解决开发时直接用px即可,插建自动转vx适配\n1.npm install postcss-px-to-viewport --save-dev\n2.根目录中创建postcss.config.js配置\nmodule.exports = {\n  plugins: {\n    \'postcss-px-to-viewport\': {\n      viewportWidth: 375 // 标准屏幕宽度}}}\n\n3.开发时先配路由再写对应页面再以使用体验依次开发对应功能\n但凡单个页面单独展示都是一级路由,每个一级路由都不建议直接在创建views目录下直接建vue文件,而是创建对应名字的文件夹\n配好架子后,我们即可配置路由了先配一级开始,看到二级路由就在一级中chilren[]数组中配置即可\n\n4.$router.go(-1) 为跳转返回上一次路由\n\n5.解决项目中axios请求冗余, 我们可以在utils中配置自己的axios(自定义基地址和超时时间)和添加拦截器 Link:  https://www.axios-http.cn/docs/instance \n响应拦截器中需要对异常进行全局处理通过vant中Toast进行通知,同时需要 return Promise.reject(error); //这样在await调用出现异常时代码不会向下执行而是跳出方法,\n通过API目录模块封装请求函数 将页面请求全部分离页面使用通过方法即可调用 通过拦截器我们进行处理时不用考虑异常情况\n\n6.涉及到循环定时器,在离开页面一定要进行销毁 \n\n7.vuex的持久化存储 通过在utils目录中定义storage.js对vuex本地存储的set,get,remove方法 使用导入即可完成\n\n8.loading请求加载画面通过Toast加载动画提示:在请求拦截器中添加动画Toast.loading({}),响应请求中结束动画Toast.close()\n\n9.路由拦截处理:全局前置守卫 router.beforeEach((to,from,next)) //对没有token进行拦截和敏感拦截\n\n10.请求携带token;我们可以在拦截器中统一进行判断本地是否有token 有的话就进行携带\n\n11.打包时在vue.config.js中配置  publicPath: \'./\'         // 设置获取.js,.css文件时，是以相对地址为基准的。\n\n// 添加响应拦截器(直接看axios官网实例)\ninstance.interceptors.response.use(function (response) {\n    // 2xx 范围内的状态码都会触发该函数。\n    // 对响应数据做点什么\n    return response;\n}, function (error) {\n    // 超出 2xx 范围的状态码都会触发该函数。\n    // 对响应错误做点什么\n    return Promise.reject(error);\n});\nexport default {\n    instance\n}\n\nvscode 快捷键: ctrl + k 加上 cltl +0 进行全都代码折叠 \n由于vue时异步更新在dom没有渲染时无法直接修改 可以通过.$nextTick{()=>{\ndom操作\n}}\n\n','http://so6b4f8dg.hn-bkt.clouddn.com/Fi7X7uQqNzX_JJfEOlFMSKw4yCGR',2,1,1,NULL,'2024-12-20 08:53:57','2024-12-20 08:53:57',21,'vue2',6,0,NULL),(64,'1',522,7,'1','http://so6b4f8dg.hn-bkt.clouddn.com/Fi7X7uQqNzX_JJfEOlFMSKw4yCGR',2,3,1,NULL,'2024-12-20 09:06:46','2024-12-20 09:06:46',21,'1',6,0,NULL),(65,'vue3,vite,ts',522,7,'VUE3 1.创建VUE3项目  npm init vue@latest 再npm i 下载依赖\n2.vue3\n1.setup函数可将数据提供页面使用 //非响应时数据\n2.1reactive(值)函数 将对象类型数据的参数传入并返回一个响应式的对象 (无法接受基础类似数据)\n2.2.ref(值)函数 可以接受简单类型或者对象类型的数据传入并返回一个响应对象 (底层基于将简单类型进行封装为对象后使用reactive函数)(使用这就OK)\n3.computed(()=>{retrun xxx})函数返回值: 逻辑计算属性\n4.watch(ref对象,(old,new)=>{逻辑},{watch配置 deep:true...})\n5.生命周期:onMouted(()=>{逻辑处理}) //对应mouted(){}  可以调用多次生命周期函数\n6.父传子: 直接在通过标签的属性来传递即可 子通过defineProps([\'属性名\'...])接收props 然后props.属性名来调用\n由于setup存在无法通过this.来调$emit() 需要通过defineEmits([\'父监听事件名\'])来获取emit对象 再通过emit(\'父监听事件名\',值)来通知父组件\n7.访问dom元素 需要先创建ref对象将该ref对象和标签绑定,通过对象.value即可获取dom元素 由于setup生命周期在渲染之前无法在需要通过onmouted()函数来操作dom\n8.由于setup无法直接获取其他组件中数据,需要将数据暴露后defineExpose({对象..})再获取\n9.跨层组件通信顶层组件通过provide(\'属性名\',ref对象,修改方法) 底层通过inject(\'属性名\')\n10.vuex替代品Pinia\n提供更加简单的API（去掉了mutation )\n提供符合，组合式风格的API（和Vue3新语法统一)\n去掉了modules的概念，每一个store都是一个独立的模块\n配合TypeScript更加友好，提供可靠的类型推断\n用法和vuex一样创建stores包index.js作为唯一出口 modlues目录存放不同仓库 外面需要使用直接导stotes包下Index即可 indexjs中配置import {}.... export {...}\n可以这样优化: export * from \'......\'\n\n11.pinia持久化插件\n下载,配置到pinia,配置需要持久化的pinia仓库((\'仓库名\',()=>{配置仓库属性return{导出}},{persist: true //开启插件}) //默认存在localstorage:key名为仓库名\n细节插件配置LInk: https://prazdevs.github.io/pinia-plugin-persistedstate/zh/guide/config.html\n12.vuex持久化插件\n\n13.pnpm包管理器: \n```sh\nnpm i -g pnpm\npnpm install\npnpm add axios\npnpm add axios -D\npnpm remove axios\npnpm dev\npnpm创建vue项目: pnpm create vue\n```\n\n\n14.prettier配置后需要禁用格式化插件\nprettier 风格配置: LINK:https://prettier.io/docs/en/options.html\n```js\n rules: {\n    \'prettier/prettier\': [\n      \'warn\',\n      {\n        singleQuote: true, // 单引号\n        semi: false, // 无分号\n        printWidth: 80, // 每行宽度至多80字符\n        trailingComma: \'none\', // 不加对象|数组最后逗号\n        endOfLine: \'auto\' // 换行符号不限制（win mac 不一致）\n      }\n    ],\n    \'vue/multi-word-component-names\': [\n      \'warn\',\n      {\n        ignores: [\'index\'] // vue组件名称多单词组成（忽略index.vue）\n      }\n    ],\n    \'vue/no-setup-props-destructure\': [\'off\'], // 关闭 props 解构的校验\n    //  添加未定义变量错误提示，create-vue@3.6.3 关闭，这里加上是为了支持下一个章节演示。\n    \'no-undef\': \'error\'\n  }\n\n```\n\n15.git 代码检查:husky 一个 git hooks 工具  ( git的钩子工具，可以在特定时机执行特定的命令 )\n1.先git init 2.pnpm dlx husky-init && pnpm install 之后会产生.husky/_/pre-commit 3.修改pre-commit 文件 将npm test 改为pnpm lint //每次提交前先进行pre-commit文件中的操作 pnpm lint 为检查代码是否有错和优化空间\ngit add . 后进行 git commit -m \'备注消息\' 时会进行husky校验\n基于这我们可以配置paskjson中脚本命令 用于检查暂存区的代码 \n1.下载 pnpm i lint-staged -D\n2.配置\n```js\n\"lint-staged\": {\n    \"*.{js,ts,vue}\": [\n      \"eslint --fix\"\n    ]\n  }\n\"scripts\": {\n    \"lint-staged\": \"lint-staged\"}\n3.pre-commit 文件进行pnpm  lint-staged\n```\n\n\n这样我们就可以在提交到暂存区既可以进行检查了\n\n16.Router路由 获取路由对象(无法通过this.$router,$route来直接使用) \n```js\nimport {useRouter,useRoute} from vue-router\n```\n\n','http://so6b4f8dg.hn-bkt.clouddn.com/FtWPAI85FFCkjjwzZIPKf3LH2Vb4',2,1,1,NULL,'2024-12-20 09:25:37','2024-12-20 09:30:56',21,'vue3,vite,ts',6,556918,NULL),(66,'uniapp(终极一套代码三端实现)',522,7,'### UniApp 简介\nUniApp 是 DCloud 公司于 2015 年开发的一款基于 Vue 的跨端框架，pages.json管理小程序页面路由\n\npages 页面路由及窗口表现\nglobalstyle 默认窗口表现\ntabBar 至少两个才显示\nmainifest.json 配置小程序id\n\nuniapp语法:(基于Vue.js规范升级优化)\n1.属性绑定src=\"{f url }}”升级成 :src=\"url\"\n2．事件绑定bindtap=\"eventName”升级成@tap=\"eventName(形参)\"，支持()传参\n3.支持Vue常用指令v-for、v-if、v-show、v-model 等\n\n### UniApp 官网\n\n[UniApp 官方网站](https://uniapp.dcloud.io/)\n\n### 1. 创建项目\n\n#### 1.1 通过 HBuilderX 可视化界面创建\n\n1. 点击工具栏里的文件 -> 新建 -> 项目（快捷键 Ctrl+N）。\n2. 选择 uni-app 类型。\n3. 输入工程名，选择模板。\n4. 点击创建，即可成功创建。\n\n具体步骤可参考 [官方文档](https://uniapp.dcloud.io/collocation/pages)。\n\n#### 1.2 通过 Vue CLI 命令行创建\n\n##### 使用正式版\n\n```sh\nvue create -p dcloudio/uni-preset-vue 项目名称\n```\n\n##### 使用 Vue3/Vite 版\n\n###### JS 版本\n\n```sh\nnpx degit dcloudio/uni-preset-vue#vite 项目名称\n```\n\n###### TS 版本\n\n```sh\nnpx degit dcloudio/uni-preset-vue#vite-ts 项目名称\n```\n\n如果命令失败，可以直接下载模板：\n\n- [JS 版本](https://github.com/dcloudio/uni-preset-vue/tree/vite)\n- [TS 版本](https://github.com/dcloudio/uni-preset-vue/tree/vite-ts)\n\n### 2. 全局文件\n\n#### 2.1 `pages.json` 管理页面路由\n\n```json\n{\n  \"easycom\": {\n    \"autoscan\": true,\n    \"custom\": {\n      \"^uni-(.*)\": \"@dcloudio/uni-ui/lib/uni-$1/uni-$1.vue\"\n    }\n  },\n  \"pages\": [\n    {\n      \"path\": \"pages/index/index\",\n      \"style\": {\n        \"navigationStyle\": \"custom\",\n        \"navigationBarTitleText\": \"首页\"\n      }\n    },\n    ...\n  ]\n}\n```\n\n#### 2.2 `manifest.json` 管理应用配置\n\n```json\n{\n  \"appid\": \"your_app_id\",\n  \"name\": \"YourAppName\",\n  \"versionName\": \"1.0.0\",\n  \"versionCode\": \"100\",\n  \"description\": \"Your app description\",\n  \"permissions\": [],\n  \"plus\": {\n    \"distribute\": {\n      \"android\": {\n        \"package\": \"com.yourcompany.yourapp\",\n        \"versionCode\": \"100\",\n        \"versionName\": \"1.0.0\"\n      },\n      \"ios\": {\n        \"bundleIdentifier\": \"com.yourcompany.yourapp\",\n        \"version\": \"1.0.0\"\n      }\n    }\n  }\n}\n```\n\n### 3. TypeScript 配置\n\n如果你使用的是 Vue3 + TypeScript 版本，需要配置 `tsconfig.json`：\n\n```json\n{\n  \"extends\": \"@vue/tsconfig/tsconfig.json\",\n  \"compilerOptions\": {\n    \"sourceMap\": true,\n    \"baseUrl\": \".\",\n    \"paths\": {\n      \"@/*\": [\"./src/*\"]\n    },\n    \"lib\": [\"esnext\", \"dom\"],\n    \"types\": [\n      \"@dcloudio/types\",\n      \"miniprogram-api-typings\",\n      \"@uni-helper/uni-app-types\",\n      \"@uni-helper/uni-ui-types\"\n    ]\n  },\n  \"vueCompilerOptions\": {\n    \"nativeTags\": [\"block\", \"component\", \"template\", \"slot\"]\n  },\n  \"include\": [\"src/**/*.ts\", \"src/**/*.d.ts\", \"src/**/*.tsx\", \"src/**/*.vue\"]\n}\n```\n\n### 4. 运行和打包\n\n查看 `package.json` 文件中的脚本命令：\n\n```json\n{\n  \"scripts\": {\n    \"dev:app\": \"uni -p app\",\n    \"dev:app-android\": \"uni -p app-android\",\n    \"dev:app-ios\": \"uni -p app-ios\",\n    \"dev:custom\": \"uni -p\",\n    \"dev:h5\": \"uni\",\n    \"dev:h5:ssr\": \"uni --ssr\",\n    \"dev:mp-qq\": \"uni -p mp-qq\",\n    \"dev:mp-toutiao\": \"uni -p mp-toutiao\",\n    \"dev:mp-weixin\": \"uni -p mp-weixin\",\n    \"build:app\": \"uni build -p app\",\n    \"build:app-android\": \"uni build -p app-android\",\n    \"build:app-ios\": \"uni build -p app-ios\",\n    \"build:custom\": \"uni build -p\",\n    \"build:h5\": \"uni build\",\n    \"build:h5:ssr\": \"uni build --ssr\",\n    \"build:mp-qq\": \"uni build -p mp-qq\",\n    \"build:mp-toutiao\": \"uni build -p mp-toutiao\",\n    \"build:mp-weixin\": \"uni build -p mp-weixin\"\n  }\n}\n```\n\n### 总结\n\n通过以上步骤，你可以快速创建和配置一个 UniApp 项目，并运行或打包到不同的平台','http://so6b4f8dg.hn-bkt.clouddn.com/FmsBrEpTun2SOFmA8scLfIqoGYEz',2,1,1,NULL,'2024-12-20 09:37:00','2024-12-20 15:45:41',21,'uniapp(终极一套代码三端实现)',6,743438,NULL),(67,'☆JAVAWeb(SpringBoot+SpringMvc+MySQL+Maven)☆',522,5,'注解总结\n1.@ConfigurationProperties //用于配置文件.yml的属性注入 使用方法:在类上加@Component,@data(提供getter方法),@configurationProperties(prefix=\"key的前缀名\") 类成员名称要和yml配置文件key的名字一致;即可完成将配置对象交给IOC管理;以便在使用时DI注入\n2.@webFilter //过滤器用于过滤请求是否符合业务需求 使用方法: 类上加上@webFilter(urlPattern = \"\")同时实现Fitler接口;重写dofilter方法 fiterChain.doFilter 放行 一般if判断后接return继续判断其他条件是否可以放行; 最后在启动类上加上@ServletComponentScan 完成servlet的组件扫描\n3.@Aspect // AOP代理 使用方法:先导入坐标,在类上加上@Aspect,同时加上@Component 再在方法上添加通知类型注解如:@Around(\"@annotation(注解的全类名)\") 我们往往使用自定义注解完成需要代理的标识 在方法中即可完成加强 方法形参joinPoint即代理对象 在@Around返回值类型为Object 返回值即为代理对象ProceedingJoinPoint.proceed 运行产生的返回值\n4.@configuration //将第三方Bean加入到IOC中 使用方法:类上加@configuration 方法上加上@bean 返回值为要成为Bean的对象即可\n5.@RestControllerAdvice //全局异常处理器 用于处理Controller层(异常一层一层往上抛最终到达Controller层)上的异常处理 使用方法:类上加上@RestControllerAdvice(会以JSON格式将数据响应给前端);方法上@ExceptionHandler(Class<T> class //捕获异常的类型)  方法返回值为和前端约定好的Result类型\n6.@ComponentScan //用于组件时增加其他jar包组件扫描(由于启动类只能扫描当前包和其子包组件无法扫描其他包下组件) 使用方法在启动类上加上@ComponentScan({\"包名\",\"包名\"}) //必须指定当前模块包名(注解会将启动类中注解覆盖无法自动扫描当前包和其子包)\n7.@import //用于直接指定需要加入到组件扫描的类 使用方法在启动类上加上@Import({要导入的Bean对象类型,...})\n我们约定在第三方jar包中需要导入的依赖, 使用@Enable什么什么的自定义注解 原理:注解中通过@import(ImportSelector的实现类//重写里面selectImports方法返回值为指定需要导入Bean名字的String数组,到时候我们可以在方法中从配置文读取需要导入bean名字即可) :其他人使用时直接使用约定注解@Enable什么什么即可完成导入 \n建议使用@EnableXXX的方法来完成导入第三方jar包中Bean\n8.@conditional 对加入的Bean对象进行条件判断是否需要加入IOC中 衍生注解有:\n1.@ConditionalOnclass(name=\"Class.全类名\")运行环境中有该类的字节码后才创建bean对象加到IOC中\n2.@ConditionalOnMissingBean() 根据name属性判断为该bean的名字,根据value属性判断为bean的类型 运行环境中没有该Bean才创建会加到IOC中\n3.@ConditionalOnProperty() 根据配置文件中有对应的属性和值.才会创建bean对象加到IOC中\n\n9.@Transactional //事务管理 使用方法在进行需要开启事务管理的Mapper方法加上注解即可\n\n10.自定义starter 思路 创建 starter模块 和  autoconfigure模块//\n1.使用maven依赖传递完成起步依赖(starter里pom文件就引入autofigure坐标,autofigure完成实现业务所学的maven坐标) \n2.我们可以通过autoconfigure模块来完成自定义的bean注入(在模块中配置类中@configuration和@bean 提供bean对象) (配置类的properties对象 来完成对yml文件的读取 @ConfigurationProperties(prefix = \"配置文件的key前缀\") )\n由于无法通过注解来用IOC注入:我们可用@EnableConfigurationProperties(\"要注入的bean对象 // 我们定义的@ConfigurationProperties类即可完成@configuration中的属性注入问题(在@bean方法中 通过方法形参来获取IOC中properties对象)\") \n3.最后通过springBoot中会对所有包下META-INF.spring里的的什么什么.imports文件 进行IOC组件扫描(将我们定义的@config类的全类名写进去即可完成IOC起步的自动配置); \n\n6.Maven细节\n1.在porm.xml配置依赖时,依赖注入时会传递依赖\n如果我们在使用依赖时不想要传递过来的依赖我们可以\n在<dependency></dependency>标签中加上\n<exclusions>\n    <exclusion>\n        <groupId>org.slf4j</groupId> //指定不需要的依赖\n        <artifactId>slf4j-api</artifactId> //指定不需要的依赖\n    </exclusion>\n</exclusions>\n\n7.<scope>标签为依赖范围 \n其中在一个项目依赖中有<scope>test</scope> //表示该项目中这个依赖只会存在于测试中,再其他项目依赖这个项目时不会将该依赖传递过去(如junit)\n取值:\ncompile(主程序,测试程序,打包(运行)) \ntest(测试程序) \nprovided(主程序,测试程序) \nruntime(测试程序,打包(运行)) \n\n8.HTTP协议\n1.底层基于TCP协议\n2.基于请求-响应模式: 一次请求对应一次响应\n3.HTTP协议是无状态的协议:(没有记忆的协议) 缺点:多次请求间不能共享数据, 优点:速度快\n\n9.SpringBoot\n@RestController 位置:Controller类上/方法上\n作用:将方法返回值直接响应，若返回值类型是实体对象/集合，转JSON格式响\n@RequsetMapping(\"/路径\") //将该方法的返回值作为服务器返回的响应  为了统一响应数据我们会定义一个Result实体类(int code,string msg,object data)并提供静态方法以方便使用\n@RequestParam(name = \"username\") //可以不写括号 在形参前加上即可\n//自动封装请求时,请求中必须含有name=\"什么什么\"的数据,否则报错) \n在@RequsetMapping(\"/路径\")的方法形参进行自动封装时:\n//将请求中类型和名字一致的数据,自动封装到方法形参,\n//形参为类时确保类中的成员变量的名字和类型和数据一致\n//在封装类中的成员类时需要请求体以!!!!!!!!!封装类名.成员类名=\"值\"的方式才能完成成员类的封装\n//在封装数组时形参为对应的数组即可\n//在封装数组时形想封装为数组需要加上@RequestParam list<数据类型>数据数组名字(如:前端请求为http://localhost:8080/users?ids=1,2,3)\n//在封装时间时需要在形参加上@DateTimeFormat(pattern = \"yyyy-MM-dd HH:mm:ss\") pattern指定时间的格式 即可\n//在封装json时需要在形参类前面加上@RequestBody 完成json转类的自动封装\n//在封装路径参数时要加上@PathVariable 并在指定路径时@RequestMapping(\"/demmo7/{id}\") 用{}将需要获取的可变参数括起来 \n如@RequestMapping(\"/demmo7/h{id}/{name}\") 形参为(@PathVariable int id,@PathVariable String name)\n//不加@RequestParam时参数不传递时,形参的封装值为null\n\n@RequestMapping(\"/simpleParam\")\npublic String simpleParam(@RequestParam(name = \"username\") String username, Integer age, String password ){\n        System.out.println(username+password+age);\n        return \"OK\";\n}\n\n10.三层架构\n数据访问:Dao层:获取数据\n业务类:service层:逻辑处理\n控制器类:controller层:受请求,回响应\n为了扩展性我们选择用接口来完成Dao和Service层中的实现\n如:dao层中获取数据有多种方式(数据库,配置文件中等等方式获取数据)我们可以定义一个数据类的dao接口 里面定义获取数据的抽象方法,其的现象类重写该方法即可完成扩展性(Service同理)\n\n11.为了解决代码之间的耦合我们可以使用IOC容器和DI依赖注入\n原理在需要解耦的对象上加上@Autowired(底层从IOC容器中获取对象), 并在提供该对象的类上加上@Component (将该类对象加到IOC容器中)\n其中@Component注解为了细分三层架构的各自的提供的代理对象我们可以用下面的衍生注解来解决\n@Controller             标注在控制器类上\n@Service 		标注在业务类上\n@Repository	标注在数据访问类上(由于与mybatis整合，用的少)\n\n12.@ComponentScan扫描器;IOC容器只能添加可以被扫瞄到的bean对象 //启动类的注解包括了扫描器 //当多次声明扫描器时会将前面声明的覆盖\n扫描器的作用大小为其所在包和其子包\n@ComponentScan(\n    excludeFilters = {@Filter(\n    type = FilterType.CUSTOM,\n    classes = {TypeExcludeFilter.class}\n)\n\n13.当多个bean可以注入时会报错\n我们可以提高bean优先级或者指定注入什么bean注入\n@Primary //提高bean的优先级\n@Autowired + @Qualifier(\"bean的名称\") //注入什么bean注入\n@Resoure(name=\"bean的名称\") //注入什么bean注入\n\n14.SQL分类\nDDL	Data Definition Language  	//数据定义语言，用来定义数据库对象(数据库，表，字段)	//直接在idea用会GUI来完成即可\nDML	Data Manipulation Language	//数据操作语言,用来对数据库表中的数据进行增删改 \nDQL	Data Query Language	//数据查询语言，用来查询数据库中表的记录\nDCL 	Data Control Language	//数据控制语言,用来创建数据库用户、控制数据库的访问权限\n\n15.SQL的数据类型\n1.数字类型 tinyint...... int, bigint, 浮点数: float,double,decimal //用于解决小数运算时精度丢失 其中所有的浮点数在声明时格式为 float(5,2)其中5为总的个数(包括个位和小数),2为小数的个数\n2.时间类型 date 日期值 datatime 混用日期和时间值\n3.字符类型 char: char (10) 定长字符串 当不足10个字符时也会占用10个字符的空间,varchar: varchar(10) 为变长字符串 不足10时输入几个字符就几个\n\n16.表设计时不要忘记加上创造时间和修改时间这两列\n\n17.SQL语句的书写\n\n1.0 DDL  //用idea中GUI即可\n非空约束,唯一约束,默认约束,主键约束,\n外键约束//了解即可: creat table 表名(\n字段名 数据类型,.....\n[constraint] [外键名称] foreign key () references 主表 (字段名)\n)\n\n2.0 DML //要眯眼也会写\n添加数据 insert into 表名 (列名....) values (值1...值n) //值和列名一一对应\n修改数据 update 表名 set 字段1=值1,字段2=值2,...... [where 条件] //不写where 时会修改所有列的数据\n删除数据 delete from 表名 [where 条件] //不写where默认删库,我看很有刑期\n\n3.0 DQL //用脚都要会的不会的出门左转\nselect 字段列表 from 表明列表(可以是多表) where 条件列表 group by 分组字段列表 having 分组后条件列表 order by 排序列表 limit 分页参数\n3.1.1 条件符号: > >= < <= = !=不说了\nbetween ...and ... //...为数据 在该范围区间的数据\nin (...) //在括号中的值之一 (多选一)\nlike 占位符 模糊匹配(  _匹配单个字符,%匹配多个字符) 如: select *from tb_emp where name like \'张%\'; //获取name为\'张\'开头的多字符\nis null 为null\nand和&& 并且\nor和|| 或者\nnot和! 非 \n3.1.2聚合函数 //将一列数据作为一个整体进行纵向计算 //加到select后面(只能加一个),用于查询结果展示\ncount()	//统计数量\nmax()	//最大值\nmin()	//最小值\navg()	//平均值\nsum()	//求和\n3.1.3分组查询 group by ....having..... // having为分完组之后再进行进一步筛选 \n使用分组查询之后可以返回的字段列表只能为聚合函数和分组字段 (分组字段以gender 分组只能写gender)\n如select job,count(*) from tb_emp where entrydate <=\'2015-01-01\' and job>=\'2\' group by job;\n底层是先进库筛选项entrydate <=\'2015-01-01\' and job>=\'2的;然后再按照job进行分组,分完组之后每组进入select进行展示\n再比如:select job,count(*) from tb_emp where entrydate <=\'2015-01-01\' group by job having count(*)>=2;\n底层是先进库筛选项entrydate <=\'2015-01-01\' 2的;然后再按照job进行分组,再进行分组之后每组个数的判断,判断完成之后每组进入select进行展示\n3.1.4排序查询// order by字段1 [排序方式] ,字段2 [排序方式 ]; //字段2 意思为 当字段一相同时再按照 字段2 进行排序\n//排序方式: ASC:升序(默认值) DESC:降序\n3.1.5 分页查询// limit 分页参数  \n分页参数: 起始索引,查询记录数 (从哪里开始,查多少) 起始索引=(页码-1)*每页记录数\n3.1.6 流程控制函数\nif(表达式,value,fvalue)\ncase ... when ... then ... when... then ...........else .... end \n\n\n18.多表设计\n一对多:在\'多\'的添加一个字段关联\'一\'的主键     \n一对一:使用较少 任一一方添加一个字段指向另一方的主键\n多对多:使用第三张表(声明两个表的主键字段)来管理两张表的关系\n\n!!!!!19.多表查询 !!!!!! //先根据需求确定查的那些表 (默认使用隐式内连接)\nselect ... from 多张表 ; //此时会用一张表的每列表进行相乘 为了获取有效数据有两种方法(内连接,外连接)\n内连接:\n隐式内连接:select ... from 多表 where 表主键和另外一张的逻辑主键相同的情况 //(建立连接)\n显式内连接:select ... from 表1 [inner] join 表2 on 连接条件 //(建立连接)\n\n外连接:\n左外连接:selcet  ... from 表1 left [outer] join 表2 on 连接条件 //(建立连接)//用所有的表1数据和表2进行条件比对连接(表1null值保留) //会左外连接即可\n右外连接:selcet  ... from 表1 right [outer] join 表2 on 连接条件 //(建立连接)\n\n20.子查询\n可以直接用多个单表查询即可完成标量子查询\n如select * from tb_emp where dept_id = (select id from tb_dept where name = \'教研部\') //先查询教研部的id 再进行单表查询\n\n21.MysSQL索引:  //mysql的索引底层为B+树:\n(1.一个节点可以有n个key,有n个key就有n个指针 \n2.每个指针都指向下一个子节点 \n3.所有数据都在叶子节点(普通节点不存值) \n4.叶子节点为双向链表便于数据的排序及区间范围查询)\n1.主键默认为一个索引\n2.在指定非空约束时该字段也为索引\n指定创建索引:\ncreat index 索引名 on 表名 (字段名....)\n查看索引\nshow index from 表名\n删除索引\ndrop index 索引名 on 表名:\n\n22.mybatis的使用\n1.创建springboot工程时选择mybatis frameword,MySQL Driver\n\n2.引入mybatis的相关依赖,配置mybatis(在resourecs下的application.properties配置)\n#驱动类名称\nspring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver\n#数据库连接的url\nspring.datasource.url=jdbc:mysql://localhost:3306//使用的数据库 \n//该的路径为IDEA连接数据库后的位置, 不指定数据库时使用Mybatis时需要加上数据库.表名 才可以完成查询 (建议直接写该项目使用的数据库)\n//(出现JDBCconnetion的问题时,99%都是你数据库连接url有问题)\n#连接数据库的用户名\nspring.datasource.username=root\n#连接数据库的密码\nspring.datasource.password=root\n\n3.编写SQL语句(注解/XML)\n编写SQL语句时如果IDEA没有连接数据库也会冒红(IDEA无法识别该表):解决IDEA连接数据库即可\n写SQL语句没有IDEA的提示怎么办? 选择写的SQL语句右键选择显示上下文,选择语言注入后再选择MYSQL即可\n因为有Mybatis框架能够自动创建接口的实现类。通过在接口中定义SQL语句的方法，并添加相应的注解，MyBatis能够根据这些注解生成接口的实现类。\n而像spring提供的@service @Controller @Repository 就得加到接口的实现类上完成添加IOC的管理\nSQL动态获取行参可以用占位符来 #{ 形参 }完成动态处理 \nmyBatis的SQL注解\n@select(\"SQL语句\") 		返回查询后的结果\n\n@update() 	返回受影响的数据数量(更新)\n\n@Insert() 		返回受影响的数据数量(新增) \n//在新增信息后想要获取其对应的主键时我们可以再加上@Options(keyProperty = \"id(返回的主键封装到形参的哪个成员变量)\" ,userGenertedKeys= true)\n如:\n@Options(keyProperty = \"id\",useGeneratedKeys = true)\n    @Insert(\"insert into db03.tb_emp (username, name, gender, image, job, entryDate, dept_id, create_time, update_time, password) \" +\n            \"values (#{username},#{name},#{gender},#{image},#{job},#{entryDate},#{deptId},#{createTime},#{updateTime},#{password}) \")\n    Integer InsertEmp(Emp emp);\n\n@Delete() 	返回受影响的数据数量(删除)	\n我们可以通过配置来完成查询myBatis底层输出的SQL语句:\n在properties中:先打myb 再打log 选择impl的 再打sout 选择StdOutImpl\n如mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl 保存即可\n\n数据封装:如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装.\n解决:\n1.给SQL语句中对应的起别名 (了解)\n2.通过@Results注解手动映射封装(了解)\n3.通过开启Mybatis的驼峰命名自动映射开关 在.properties中配置\n#驼峰命名映射 //(数据库的列名为_分隔,javaBean中的为大写分隔才能完成自动映射)\nmybatis.configuration.map-underscore-to-camel-case=true\n为了解决#{}无法在 字符串中使用我们可以使用Concat(字符串,字符串,字符串)来完成字符串之间的拼接\n如@Select(\"select * from db03.tb_emp where name like Contains(\'%\',#{name},\'%\')\")\n\n23.XML映射文件来完成mybatis查询\n1.XML映射文件的名称与Mapper接口名称一致，并且将XML映射文件和Mapper接口放置在相同包下（同包同名)。\n2.XML映射文件的namespace属性为Mapper接口全限定名一致。\n3.XML映射文件中sql语句的id与Mapper接口中的方法名一致，并保持返回类型一致。\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper\n        PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n        \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n<mapper namespace=\"com.example.springbootmybatisdemo.dao.EmpMapper\"> //namespace为Mapper所在的包名\n    <select id=\"findByEd\" resultType=\"com.example.springbootmybatisdemo.domain.Emp\"> //id为Mapper中方法 resultType为单条返回值的全类名\nselect * from db03.tb_emp where name like Contains(\'%\', #{name}, \'%\') and gender = #{gender} and entryDate between #{startTime} and #{endTime}\n    </select>\n</mapper>\n\n24.动态SQL\n为了实时监测传输过来的数据是否为null我们可以使用\n1.1.<if test=\"条件\">符合后要拼接SQL语句</if>标签来完成动态的SQL\n1.2.为了解决 <if></if>结尾多渲染了\'and\' 如 我们可以使用<where>标签 来完成自动清除多余的\'and\'或者\'or\',并且在where的子元素没有内容时不会生成where的子句\n1.3.为了解决 <if></if>结尾多渲染了\',\'  我们可以加上<set>标签 来完成自动清除多余的\',\'\n <update id=\"empUpdate2\">\n        update db03.tb_emp\n        <set>\n            <if test=\"username != null\">\n                username= #{username},\n            </if>\n            <if test=\"name != null\">\n                name = #{name},\n            </if>\n            <if test=\"gender != null\">\n                gender = #{gender},\n            </if>\n            <if test=\"updateTime != null\">\n                update_time = #{updateTime}\n            </if>\n        </set>\n        <where>id = #{id}\n        </where>\n    </update>\n\n2.1<foreach></foreach>循环标签:用于处理传输过来的数据为数组或者集合的SQL操作\n属性为: \ncollection=\"emps\" //要遍历的元素\nitem=\"emp\" //遍历到的元素\n separator=\",\"  //元素之间的分隔符\nopen=\"(\" //遍历开始前拼接的SQL片段\nclose=\")\" //遍历结束前拼接的SQL片段\n\n<delete id=\"deleteEmpList\">\n        delete from db03.tb_emp where id in\n        <foreach collection=\"ids\" item=\"id\" separator=\",\" open=\"(\" close=\")\">\n         #{id}\n        </foreach>\n</delete>\n\n3. <sql id=\"xxxx\"></sql> //将xml中重复的SQL语句抽取出来,提供给include使用\n<include refid=\"SQL标签的id\"></include> //将sql标签中sql引入到使用\n如:<select id=\"findById\" resultType=\"com.example.springbootmybatisdemo.domain.Emp\">\n        <include refid=\"CommonSelect\"/>\n        <where>\n            <if test=\"name != null\">name like CONCAT(\'%\',#{name},\'%\')</if> --字符串中使用占位符要使用concat函数!!!!\n            <if test=\"gender != null\">and gender = #{gender}</if>\n            <if test=\"begin != null and end != null\">and entryDate between #{begin} and #{end}</if>\n        </where>\n        order by update_time DESC\n    </select>\n\n25.请求方式规范\nGET:查询用户\nPOST:新增用户\nPUT:修改用户\nDEIETE:删除用户\n\n26.开发流程\n查看页面原型   开发接口文档	阅读接口文档         思路分析	接口开发	接口测试	前后端联	调明确需求\n\n27.为了解决分页查询时要多次查询(先查询数据,再查询数据的数量)可以使用第三方插件pagehelper来完成 \n//1．设置分页参数\nPageHelper.startPage (page, pagesize) ;\n//2．执行查询\nList<Emp> empList = empMapper.list ();\nPage<Emp> p = (Page<Emp>) empList;\n//3．封装PageBean对象\nPageBean pageBean = new PageBean(p.getTotal(), p.getResult() );return pageBean;\n\n\n28.前端网页IO从from表单传输文件数据(post请求) 需要在from 标签中属性 enctype=\"multipart/form-data\"才能将文件整体以请求传输进来,否则只能传输文件名\n后端可以在形参中使用 MultipartFile 名字 //和请求中的一致 来完成自动接收(不用自己IO) //MultipartFile 为临时文件方法出栈就会删除我们可以使用其提供的transferTo(File file) 将其存放到指定路径下\nmybatis的Multipart允许传输最大文件为1M 我们可以自己修改Multipart对应文件值\n如:\nspring.servlet.multipart.max-file-size=10MB //单个文件大小\nspring.servlet.multipart.max-request-size=100MB //单个文件\n\n29.第三方服务通用思路\n1.准备工作 //创建账号 充钱\n2.参考官方SDK编写入门程序 //Software Development Kit的缩写，软件开发工具包，包括辅助软件开发的依赖（jar包)、代码示例等，都可以叫做SDK\n3.集成使用 \n\n拿阿里云OSS举例\n1.maven坐标:https://help.aliyun.com/zh/oss/developer-reference/java-installation\n2.官方SDK 位置:https://help.aliyun.com/zh/oss/developer-reference/simple-upload-11?spm=a2c4g.11186623.0.0.71b55c71v372gN\n\n30.springboot配置文件 (.properties或者.yml)\n1.除了修改各种参数还可以用来存储自己的配置信息//并且不需要自己IO流去读取properties文件,\n//用@Vaule(\"${properties中的key}\")注解就可以配置的属性注入!!!!!!\n2.application.yml配置文件 //和properties一样使用@value(yml中的key)完成配置注入\n格式:\n#自定义对象 //注意 属性key: 属性值 :后面一定要加空格, 同级属性需要对齐\nuser:\n  name: IOJAM\n  age: 20\n  address: NEWYORK\n#定义数组  //注意数组的元素使用- 元素值 定义\nhobby:\n  - java\n  - c\n  - game\n  - sport\n\n3.为了解决@value(${key值})在使用时需要自己一个个加.可以在定义一个属性类上使用@ConfigurationProperties(prefix=\"key的前缀名\")\n同时确保key名的属性命名和成员变量中一致并且提供成员变量的getter和setter方法(@Data)并交给IOC容器管理(@Component) 就可以完成批量添加\n在需要该属性时通过IOC容器获取到该对象再使用提供的getter方法一个一个获取即可(注意是在新建的属性类上添加使用时再通过专门注入进来获取属性值)\n(评价:很多很多的属性时再使用吧,一般还是@value(${key的全名})注入) 优点:可以复用:需要使用时直接从IOC容器中拿即可\n\n31.HTTP回话 //解决HTTP协议无法识别多次请求是否源于同一设备\n1.Cookie: 优点1.HTTP协议中的支持的技术 缺点:1.移动端APP无法使用Cookie 2.不安全:用户可以自己修改cookie值或者禁用Cookie 3.Cookie无法跨域(协议,IP/域名,端口中任一 一项不同都属于跨域)\n2.Session 优点1.基于Cookie 2.存储于服务器 缺点:Cookie的缺点并且无法在服务器集群中直接使用Session\n3.令牌技术:每次发起请求时先进行统一拦截 进行比对令牌的有效性(有效就放行,无效跳转到获取令牌页面) \n优点:1.支持PC,移动端 2.解决集群环境下认证问题(令牌不会存储在服务器) 3.减轻服务器端存储压力 (如果令牌值一旦修改就无法通过有效性检查)\n令牌技术(JWT)(Json Web Token) \n组成:Header(头) 记录令牌类型,签名算法	//通过BASE64编码\nPayload(有效载荷) 携带自定义,默认信息	//通过BASE64编码\nsignature(签名) 将header,payload和加入指定秘钥,通过指定算法计算而来	//不是BASE64编码\n令牌使用:\n1.引入依赖\n<dependency>\n            <groupId>io.jsonwebtoken</groupId>\n            <artifactId>jjwt</artifactId>\n            <version>0.9.1</version>\n        </dependency>\n2.使用Jwts.bulider.singwith(//签名的算法,String 秘钥).setClaims(//自定义内容 Map map).setExpiration(//令牌有效时间 Date date)//如new Date(System.currentTimeMillis()+3600*1000) .compact(); //获取该秘钥的字符串\n3.解析JWT令牌 //解析鉴别有效性: 一旦JWT令牌报错就说明令牌无效\nJwts.parser().setSigningKey(之前设计的秘钥).parse(String JWT令牌).getBody() //获取数据 \n\n32.统一拦截器\n1.Filter过滤器 \n使用\n1.定义一个Filter实现类重写 doFilter() //拦截到请求时调用\n2配置Filter 在该类上加上@WebFilter(urlPattern = \"\") 配置拦截路径 并且在启动类上加上@ServletComponentScan开启Servlet组件支持\ndoFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain){\nfiterChain.doFilter(servletRequest,servletResponse); //放行 访问web资源\n}\n3.Filter过滤器链\n如果一个请求中被多个过滤器拦截会按照过滤器的 名字顺序来进行过滤  如 先到A A放行 再到B B放行 执行完成后 回到B 回到A\n登入逻辑:\n先将servletRequest转为HttpservletRequest再获取.getRequestUrl()请求路径 对请求路径继续是否包涵可以放行路径判断,再获取.getRequsetHead(\"token\")请求头中的token的字符串 对该令牌进行判断 为空,长度为0 令牌报错时将指定的数据返回(和前端约定收到\n{\"code\": 0,\n\"msg\": \"NOT_LOGIN\",\n\"data\": null})\n后跳转到登入页面\n或者进行资源重定向完成跳转到登入界面\n重定项操作:(二选一)\n1.httpServletResponse.setHeader(\"Location\", \"/login\"); \nhttpServletResponse.setStatus(302); // 设置状态码为 302\n2.httpServletResponse.sendRedirect(url); \n\n2.Interceptor拦截器\n1.创建HandlerInterceptor的实现类 重写方法 其preHandle()的返回值true为放行 反之亦然 并且将该类交给IOC容器\n2.创建WebMvcConfiguration继承WebMvcConfigurationSupport的实现类 重写addInterceptors()方法 类上加@Configuration注解 通过注入上面的HandlerInterceptor的实现类对象 //多个拦截器都在该类中的addInterceptors()中进行调用.addInterceptor()注册  //类名一定要固定,否则无法扫描\n3.调用形参中的InterceptorRegistry.addInterceptor(//上面的HandlerInterceptor的实现类对象).addPathPatterns(\"/**\")//拦截的路径.excludePathPatterns(\"/login\")//排除这些路径\n/*为一级路径 /**为所有路径\n\n33.Filter和Interceptor的区别 (二选一)\n1.Filter作用在Tomcat中 Interceptor作用于Spring框架\nTomcat只识别Servlet不识别Controller,所以Filter的范围更大(包括Spirng的还有不是Spring的)\n\n34.全局异常处理器//在Controller层捕获异常\n定义一个类加上@RestControllerAdvice 方法上@ExceptionHandler(Class<T> class)//方法捕获异常的类型\n如:\n@RestControllerAdvice //底层为@ControllerAdvice和@ResponseBody\npublic class MyexceptionHandler {\n    @ExceptionHandler(Exception.class) //可捕获的类型\n    public Result ex(Exception ex){ //当前异常对象\n        ex.printStackTrace(); \n        return Result.error(ex.getMessage()); //以json格式返回前端数据\n    }\n}\n\n35.事务管理(在单个方法中多次操作数据库时开启事务管理)\n事务是一组操作的集合,它是一个不可分割的工作单位,这些操作要么同时成功,要么同时失败.\n开启事务(一组操作开始前,开启事务) start transaction /begin ;\n提交事务(这组操作全部完成后,提交事务): commit ;\n回滚事务(操作过程出现异常,回滚事务): rollback;\nSpring框架中@Transactional可以完成自动完成该方法的事务管理 \n使用:在service层中需要开启事务管理的方法上加上@Transactional即可 //只有当方法中出现RuntimeExecption才可以完成回滚 //可以通过rollbackFor=来指定异常的类型进行回滚\n2.传播行为:当一个事务被另一个事务方法调用时.事务应该怎么执行\n可以按照在每个事务的属性propagation = Propagation.属性值 \n//取值:REQUIRED(默认值) 需要事务有就加入,没有就创建新事务  \nREQUIRED_NEW //无论是否有新事务都新建新事物. //两个事务没有必要联系时使用\n3.配置开启事务时的日志管理\n\n36.AOP(切面)//将IOC提供bean进行代理增强,并将增强后的bean对象注入到使用中\n动态代理是面向切面编程最主流的实现。而SpringAOP是Spring框架的高级技术，旨在管理bean对象的过程中，主要通过底层动态代理机制,对特定的方法进行编程。\nSpring的AOP使用:\n1.坐标<dependency>\n            <groupId>org.springframework.boot</groupId>\n            <artifactId>spring-boot-starter-aop</artifactId>\n        </dependency>\n2.定义一个类加上@Component @Aspect//告诉IOC容器这个bean对象是AOP对象\n3.定义代理加强的方法,需要从形参中获取ProceedingJoinPoint //当前进程对象 并在方法上加上@Around(\"execution()\") //指定那些方法可以被AOP代理\n如:\n@Aspect\n@Component\n@Slf4j\npublic class TimeAop {\n    @Around //通知类型 (\"execution(* com.example.myprojecttest1.service.*.*(..))\")   //切入点表达式\n    public Object recordTime (ProceedingJoinPoint proceedingJoinPoint) throws Throwable { //该方法又被称为通知\n        long start = System.currentTimeMillis();\n        Object proceed = proceedingJoinPoint.proceed(); //运行原有方法,并获取运行结果\n        long end = System.currentTimeMillis();\n      log.info(proceedingJoinPoint.getSignature()+\"运行了\"+(end-start));\n      return proceed; //将返回值交给进程\n    }\n}\n通知类型\n!!!@Around:环绕通知，此注解标注的通知方法在目标方法前、后都被执行!!  !\n@Before:前置通知，此注解标注的通知方法在目标方法前被执行\n@After :后置通知，此注解标注的通知方法在目标方法后被执行，无论是否有异常都会执行\n@AfterReturning : 返回后通知，此注解标注的通知方法在目标方法后被执行，有异常不会执行\n@AfterThrowing :异常后通知，此注解标注的通知方法发生异常后执行\n为了解决切入点的重复定义 我们可以将其抽取到一个加了@pointcut(\"切入点表达式\")注解的方法,在其他的通知类型中再通过@通知类型(\"提取切入点的方法名\")来完成引入 //并且可以想使用类一样可以在多个类中使用该切入点\n\n切入点表达式 //可以并且可以使用且(&&)、或（||）、非(!）来组合比较复杂的切入点表达式。!!!!!直接用自定义注解来完成切入点很重要\n1.execution(访问修饰符? 返回值  包名.类名. 方法名(方法参数)   throws 异常? ) 其中包名.类名中的通配符: \n*单独任意符号, \n .. 多个连续的任意符号(可以是任意层级的包任意类型和参数)\n之前的* com.example.myprojecttest1.service.*.* (..)   理解为返回值为任意的com.example.myprojecttest1.service包下的所有的所有方法形参为连续任意的方法\n2.@Around(\"@annotation(自己定义的注解的全类名)\")切入点表达式\n作用让所有加入自定义注解的方法成为AOP代理对象\n\nAOP的连接点: //在Spring中用JoinPoint抽象了连接点，用它可以获得方法执行时的相关信息，如目标类名、方法名、方法参数等\n对于@Around 通知，获取连接点信息只能使用ProceedingJoinPoint\n对于其他四种通知，获取连接点信息只能使用JoinPoint，它是 ProceedingJoinPoint 的父类型\n如在@Around中使用proceedingJoinPoint.getArgs()获取方法形参完成敏感词过滤\nJoinPoint.proceed(); //运行原有方法,并获取运行结果\njoinPoint.getTarget().getClass().getName() //获取运行的类名\njoinPoint.proceedingJoinPoint.getArgs() //获取运行的形参\njoinPoint.getSignature().getName() //获取运行的方法名\n\n接入点基于@annotation(自定义注解的位置)可以轻松完成在使用了自定义的注解的地方进行AOP方法代理\n\nJSON工具包使用\n直接注入Springboot IOC自动配置的Gson对象的.toJson(Object )即可\n\n细节\n1.配置的优先级properties>yml(主要使用.yml)>yaml\n2.@AutoWired \nApplicationContext applicationContext //获取IOC容器,将IOC容器注入 (.getBean() 获取bean对象)\n3.Bean的作用域@Scope(\"singleton\") 默认为单列的(singleton)(每次使用都是那一个不会重新创建) 取值为\"prototype\"时为非单列的\n4.如果需要管理的Bean对象来自第三方(非自定义的),无法自己使用@Component及其衍生注解我们可以使用@bean.\n使用:在自定义的@Configuration配置类中定义返回值为该第三方bean对象方法并加上@Bean即可 //该配置类可以配置多个第三方的bean对象\n@Configuration的底层也是一个@Component IOC容器对象\n5.SpringBoot原理\n5.1起步依赖:(原理:Maven的依赖传递)\n5.2自动配置:(当Spring容器启动后一些配置类,bean对象就会自动存到IOC容器中不需要手动声明)\n5.3注入第三方依赖定义中的bean对象 //之所以可以在启动类完成导入第三发bean对象因为@SpringBootApplication也是一个@Configuration\n1.导入普通类\n在启动类上加上@import({Class 需要导入的类})\n2.导入配置类(第三方依赖中定义第三方定义的Bean对象@Configuration 类)\n在启动类上加上@import({Class 需要导入的类})\n3. 导入ImportSelector接口的实现类 //该类的实习类重写selectImports方法 用于定义了需要导入的Class的全类名 返回值为String[]\n一样在启动类上加上@import({Class 需要导入的类})\n4.由于第三方依赖一般都会提供一个@EnableXXXXXX的注解 该注解就是完成使用这个第三方依赖需要导入的bean对象的注解 //该注解底层为第三种方法由第三方完成我们直接在启动类上加上@EnableXXXXXX的注解即可\n5.4@SpringBootApplication\n@SpringBootConfiguration  //配置类注解\n@ComponentScan //组件扫描注解\n@EnableAutoConfiguration //Springboot将需要导入的Bean对象(spring实现自动化的核心注解):\n底层为@Import(AutoConfigurationImportSelector.class) 中AutoConfigurationImportSelector读取\nMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件后将这个文件中所有的全类名通过@import加到IOC容器中\nSpringBoot2.XXX 时会读取这个文件和另外一个spring.factories文件 SpringBoot3.XXX 就只读上面这个文件了该文件在SpringBoot Web项目构造时的依赖包中(org.springframework.boot:spring-boot-autoconfigure依赖包下的META-INF/spring),该文件在Springboot2.7.x之后才有,之前都是读取spring.factoriies\n5.5自动配置会对加了@Conditional注解的bean进行条件判断只有在满足条件之后进行将Bean加到IOC容器之中\n子注解:\n1.@ConditionalOnclass(name=\"Class.全类名\")运行环境中有该类的字节码后才创建bean对象加到IOC中\n2.@ConditionalOnMissingBean() 根据name属性判断为该bean的名字,根据value属性判断为bean的类型 运行环境中没有该Bean才创建会加到IOC中\n3.@ConditionalOnProperty() 根据配置文件中有对应的属性和值.才会创建bean对象加到IOC中\n\n1.Maven分模块开发\n解决项目所有模块都在一个项目中过于庞大可以将不同功能的模块分开开发,对应公共的javabean对象类也划分为一个单独模块在使用时再引入对应坐标即可\n注意是分模块设计不是新建项目;是在该项目中新建模块\n\n2.继承:解决各个模块可能会有相同的依赖这时,我们可以定义一个父模块用于所有子模块的父工程,该父工程引入所有公共依赖(父工程和普通maven一样配置只是需要指定为pom的打包方式) 父工程继承spring的起步依赖即可\n子工程使用<parent>标签指定继承关系即可,我们在父工程引入依赖即可\n<parent>\n<groupid>父工程组号id\n<artifactId>父工程id\n<Version>版本\n<relativePath>父工程相对该工程的路径 //如果不指定会从本地仓库或者中央仓库查找是否有该工程\n</parent>\n父工程的版本锁定:\n父工程还可以通过<dependencyMangement><dependencies>中定义所有子工程的依赖, 在<dependencyMangement>的依赖不会直接引入到项目而是在子工程使用时可以不指定版本号引入该依赖(父工程中dependencyMangement指定版本)\n\n3.聚合:在父工程中将多模块组成一个整体用时进行项目构建,解决单个模块在引入多模块时,需要手动进行所有模块的打包和安装才可以运行\n使用:在一个聚合工程通过<modules>设置聚合工程(父工程)包含的子模块名称\n<modules>\n<module>目标模块的相对路径<module>\n<module>目标模块的相对路径<module>...\n</modules>\n在项目使用时通过启动父工程即可自动完成多模块的打包和安装\n','http://so6b4f8dg.hn-bkt.clouddn.com/FroTjR4Cbk5PbcHcTAqicNnzor0v',2,1,1,NULL,'2024-12-20 15:51:08','2024-12-20 15:55:53',21,'JAVAWeb(SpringBoot+SpringMvc+MySQL+Maven(JAVA后端开发基础重要程度不言而喻))',6,0,NULL),(68,'MybatisPlus',522,5,'1.解决mybatis大量基础的CRUD操作费时,使用mp即可解决\n使用:\n1.引入坐标 //由于mp实现了mybatis的起步依赖所有在引入mp后可以将mybatis的起步依赖去除\n<dependency>\n            <groupId>com.baomidou</groupId>\n            <artifactId>mybatis-plus-boot-starter</artifactId>\n            <version>3.5.3.1</version>\n        </dependency>\n2.要简化的Mapper接口继承BaseMapper<mapper处理的JavaBean对象类型>\n3.使用其父类的方法使用即可\n\n2.MP操作数据库时的映射约定:\n1.类名驼峰转下划线作为表名\n2.名为id的字段作为主键\n3.变量名驼峰转下划线作为表的字段名\n解决以上问题可以用MP提供的注解:\n@TableName() //在类上指定表名\n@TableId(type=....) //指定表中主键信息 type的类型AUTO (该主键为自增长),ASSIGN_UUID (该主键为雪花算法),INPUT (该主键为插入值) //如果不指定默认在id不赋值时插入时id以雪花算法来生成id\n@TableField() //用来指定表的普通字段信息\n使用@TableField的常见场景∶\n成员变量不是数据库字段(在成员变量上添加@TableFieId(exist=false) 告诉MP该变量不是数据库字段)\n成员变量名与数据库寄段名不―致 \n成员变量名与数据库关健字冲突(如表中有个order排名的字段,在使用MP时要在bean中该成员变量加上@TableFieId(\"\'order\'\")用\'\'来将关键词引起来)\n\n3.MP常见yml配置 (继承了MyBatis的原生配置)\nmybatis-plus:\n#原生配置\n  type-aliases-package: com.itheima.mp.domain.po #别名扫描包\n  mapper-locations: \"classpath* : /mapper/**/*.xml\" # mapper.xml文件地址，默认值resources下的mapper包下的所有xml文件(推荐:或者直接在resources下创建mapper包即可完成自动扫描(使用MP才可以自动扫描只使用mb时需要自己配置mapper-locations属性))\n  configuration:\n    map-underscore-to-camel-case: true //开启驼峰命名\n    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl //开启SQL语句打印\n#特有配置\n  global-config:\n     db-config:\n         id-type: assign_id  #id为雪花算法(默认值)\n         update-strategy: not_null    #更新策略:只关系非空字段(默认值)\n\n4.核心功能:\n1.条件构造器:Wrapper 衍生物: QueryWrapper查询构造器 UpdateWrapper更新构造器\n使用:在使用mapper的特定查询时需要传递对应条件构造器;\n如: 查询用户名有o的余额大于等于1000的用户\n//SQL语句:SELECT id,username,info,balance FROM user WHERE (username LIKE ? AND balance >= ?)\nQueryWrapper<User> ge = new QueryWrapper<User>().\n                select(\"id\", \"username\", \"info\", \"balance\").\n                like(\"username\", \"o\").\n                ge(\"balance\", 1000);\n        userMapper.selectList(ge);\n//修改id为1,2,4 钱减去200   :  update from biao set ()  where (id in ())\n        User user = new User();\n        UpdateWrapper<User> id = new UpdateWrapper<User>()\n                .setSql(\" balance = balance - 200 \")\n                .in(\"id\", List.of(1, 2, 4));\n        int update = userMapper.update(user, id);\n        System.out.println(update);\n//将jack的钱设置为2000\nUser user = new User();\n        user.setBalance(2000);\n        UpdateWrapper<User> eq = new UpdateWrapper<User>().eq(\"username\", \"jack\");\n        int update = userMapper.update(user, eq);\n        System.out.println(update);\nQueryWrapper和LambdaQueryWrapper通常用来构建select,delete,update的where条件部分\nUpdatewrapper和LambdaUpdateWrapper通常只有在set语句比较特殊才使用\n尽量使用LambdaQueryWrapper和LambdaUpdatewrapper,并使用映射Bean对象::字段的getter 来完成字段的指定,避免硬编码如\n//修改id为1,2,4 钱减去200   :  update from biao set ()  where (id in ())\n         User user = new User();\n        LambdaUpdateWrapper<User> id = new LambdaUpdateWrapper<User>()\n                .setSql(\"balance = balance - 200 \")\n                .in(User::getId , List.of(1, 2, 4));  //不直接使用\"id\"字段而是引用User对象中的方法获取字段\n        int update = userMapper.update(user, id);\n        System.out.println(update);\n\n2.自定义SQL\n我们可以利用MyBatisPlus的Wrapper来构建复杂的where条件，然后自己定义mapper中方法并且用@param(\"引用形参的名字\")其中条件wrapper必须使用功能@param(\"ew\")才能完成引入,使用使用时必须使用${ew.customSqlSegment}来完成自定义SQL的注入,\n List<Integer> integers = List.of(1, 2, 4);\n        int money=200;\n        LambdaQueryWrapper<User> list = new LambdaQueryWrapper<User>().in(User::getId, integers); //完成where的条件建立\n        userMapper.updateMoneyByIds(list,money); //在mapper中创建方法来完成修改 \nmapper代码\n@Update(\"update mp.user set balance = balance - #{money} ${ew.customSqlSegment}\") //必须是ew.\n    void updateMoneyByIds(@Param(\"ew\") LambdaQueryWrapper<User> list, @Param(\"money\") int money); //使用@Param(\"引入时的名字\") LambdaQueryWrapper<User> 必须为@Param(\"ew\") 不能自己指定\n}\n\n3.Service接口:IService<T>接口//解决Service层中基础CRUD的定义\n使用;\n因为直接使用ServiceImpl实现类去继承IService的实现类ServiceImpl<操作的mapper,操作的对象 Object> 在实际开发时都是调用service接口来使用,因此使用service接口无法调用实现类继承的方法,我们可以在service中也去继承IService,service的实现类继承ServiceImpl,既可以完成从service接口调用实现类中的方法.\n\n4.多条件查询\n1.先在Controller层数据封装交给service层,service进行条件封装后进行调用mapper的查询操作\n使用时先判断\n        LambdaQueryWrapper<User> userLambdaQueryWrapper = new LambdaQueryWrapper<User>() \n//条件构造器的方法重载可以先进行判断再进行SQL语句的拼接\n                .like(name!=null,User::getUsername,name)\n                .eq(status!=null,User::getStatus,status)\n                .ge(minBalance!=null,User::getBalance,minBalance)\n                .le(maxBalance!=null,User::getBalance,maxBalance);\n        List<User> users = userMapper.selectList(userLambdaQueryWrapper);\n        return users;\n或者直接使用Iservice中lambdaQuery()来获取wrapper对象进行条件判断后最后进行.list()根据条件来获取数组,.count()根据条件统计数量,....\n\n5.扩展\n1.代码生成器(直接使用IDEA的mybatisplus插件)\n使用:下载插件后会有一个其他栏,配置号目标数据库连接后指定要包名和位置选择要生成的代码即可\n\n2.静态工具 Db.//实现IService的工具类使用和IService接口一模一样只是每次使用都要指定对应操作的Class \n使用场景:当业务层需要其他业务层来完成开发时为了解决循环依赖,直接使用Db即可\n\n3.逻辑删除: 由MP自动在操作数据时进行根据逻辑删除的字段进行判断该数据是否进行操作,我们只负责配置即可.\n使用yml文件中配置\nmybatis-plus:\n  global-config:\n    db-config:\n      logic-delete-field: flag #指定全局的逻辑删除的实体字段名(可以为boolean或者integer)\n      logic-delete-value: 1 # 指定已经删除时的值\n      logic-not-delete-value: 0 #指定未删除时的值\n在我们调用mq的删除操作时会进行update修改逻辑字段值而不是进行delete操作\n缺点:无法真正删除会占数据库内存\n\n4.枚举处理器:解决某些使用int值来表明字段状态时,无法明确该值的含义我们可以使用枚举来定义该字段状态,但是我们无法直接将数据库中int字段值直接变为枚举类型,需要引入MP的枚举处理器完成\n1.导入yml配置\nmybatis-plus:\n  configuration:\n      default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler //完成配置处理器实现类型转换\n2.在javabean中将成员变量中int改为自定义的枚举 并在枚举中和数据库相对应的值添加@EnumValue注解并提供getter方法\n\n5.json处理器//了解即可,自己使用Gso转换即可\n\n6.分页插件(使用这个即可pageHelper可以不去使用)\n使用:\n1.配置插件;在@configuration配置类中定义一个返回值为MybatisPlusInterceptor 的bean !!!一点要配置分页插件才可以使用.page方法不然报错!!!\n@Bean\n    public MybatisPlusInterceptor mybatisPlusInterceptor(){\n        //初始化核心插件(没有什么功能只是进行拦截操作)\n        MybatisPlusInterceptor interceptor =new MybatisPlusInterceptor();\n        //添加分页插件\n        PaginationInnerInterceptor pageInterceptor=new PaginationInnerInterceptor(DbType.MYSQL);\n        //设置分页上限\n        pageInterceptor.setMaxLimit(1000l);\n        interceptor.addInnerInterceptor(pageInterceptor);\n        return interceptor;}\n2. 使用即可\nPage<User> page = Page.of(1,5); //mybatisplus包下的page对象\n    page.addOrder(new OrderItem(\"balance\",true)); //设置排序规则 后面Boolean值为是否安asc升序排序\n    page.addOrder(new OrderItem(\"id\",true)); //如果上一个排序规则无法分开就继续排序\n    Page<User> page1 = userService.page(page); //进行全表查询,将结果封装到page中并返回 //返回值的page1对象和之前的page为同一个\n    System.out.println(page1.getPages()); //获取\n    System.out.println(page1.getTotal()); //获取总数\n    System.out.println(page1.getRecords().toString()); //获取数据\n\n\n\n\n\n\n\n','http://so6b4f8dg.hn-bkt.clouddn.com/Fpxx3E_QUPKgpa88hYiR6M6_lcXn',2,1,1,NULL,'2024-12-20 16:02:49','2024-12-20 16:02:49',21,'MybatisPlus(注意使用时开发规范即可(service层进行dao层操作))',6,0,NULL),(69,'Linux(Centos)',522,6,'文件类型\n/bin‌：存放标准的Linux工具，如ls、cp等。这些命令对所有用户都可用。\n‌/sbin‌：包含系统管理命令，如reboot、fdisk等，通常由系统管理员使用。\n‌/etc‌：存储系统配置文件，如网络配置和用户权限设置。\n‌/dev‌：包含设备文件，代表系统中的各种设备。\n‌/proc‌：虚拟文件系统，包含系统进程的相关信息。\n‌/var‌：存储可变数据，如日志文件和邮件。\n‌/tmp‌：临时文件目录，存储临时数据，重启后数据会被清除。\n‌/usr‌：包含用户程序和库文件，如/usr/bin和/usr/lib。\n\n```sh\n防火墙\n查看防火墙状态：firewall-cmd –state 或者systemctl status firewalld.service\n启动防火墙：systemctl start firewalld.service\n关闭防火墙：systemctl stop firewalld.service\n重启：systemctl restart firewalld.service\n开机启用：systemctl enable firewalld.service\n禁止开机启动：systemctl disable firewalld.service\n查看是否开机启动：systemctl is-enabled firewalld.service\n```\n![](http://so6b4f8dg.hn-bkt.clouddn.com/Fnv40su6mHf0SzuiKkdZVn5xafqo)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/Fq9nnJTlic6tNVVU_0SgBQ2pYaBT)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FloAmPWKHyO0k6t64GP362_Y36xZ)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/Fq09F1jqBwD7YUase9uau0hQsJJs)\n','http://so6b4f8dg.hn-bkt.clouddn.com/FvbokO_qv1vrj9NkCu6jTEeh_QRq',2,1,1,NULL,'2024-12-20 16:22:04','2024-12-20 16:22:04',21,'Linux(Centos)',6,0,NULL),(70,'Docker',522,6,'大好人整理的link:[Docker笔记(SpringCloud)](https://b11et3un53m.feishu.cn/wiki/space/7229522334074372099?ccm_open_type=lark_wiki_spaceLink&open_tab_from=wiki_home)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FuiupDgaY86yZFRmjr6xqv1JjxWs)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/Fp1oFzZW9RQfIi2n-lSjZUA0LArc)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FkQPpcfOuhCCAM0uVcDIrkdzdPbc)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/Fkxb7iQ8nqeepNlELUSTYTZE2NDi)\n','http://so6b4f8dg.hn-bkt.clouddn.com/FmZqbst1xa0xf7WlWAPlCeZPZ034',2,1,1,NULL,'2024-12-20 16:25:46','2024-12-20 16:25:46',21,'Docker',6,531137,NULL),(71,'SpringCloud_Note(Nacos+Getway+Sentinel+Seata)',522,5,'![](http://so6b4f8dg.hn-bkt.clouddn.com/FjGUaivYxAffPMs2964avz8jnKBq)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FkmhIc2owUlZCQJYvnC-5KXsPQZK)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/Fo86kL2NjoA4RIT2F5yEmhAxgM0H)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FssEFyOiKVZZkOHRsq2SPNRvIhvv)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FrxZSWspHHOOCFq6LV3qKCGYELxC)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FjUO3bfR4uyp9uOsupf7fVXzPl6J)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/Fjf5YC6ykQzWzwlfIEI2Vezz9-b3)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FkZDkuI6sR72f0r020CgjpRhdk8O)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FtaQ3ah9hAok_KLR_B4DFlSAmFaq)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FrA_OQOYFH-o8slvN274yc8fGVoQ)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FmMLucNNPVXm1lTVcaw28uCBU066)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FlCeYKlL1yLnn3W1uCiGKv5sd8Ki)\n','http://so6b4f8dg.hn-bkt.clouddn.com/FtqUbn1UpgdPUJs6Nm4ejmyMDBxo',2,1,1,NULL,'2024-12-20 16:44:38','2024-12-20 16:44:38',21,'剩下的MQ和ES分开了方便看',6,0,NULL),(72,'MQ(RabbitMQ)',522,5,'\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FlowckUdjdMdVQoifWk--O4RApco)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FoUp4ZUQ6WXvPTmUsi_oDXtlTaBA)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/Fn0DukdbKBnoB7g_bhCKsuxuVSIx)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/Fh5kpXxGR0X2qHh8CS1wZRiJ8Dl8)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/Fr-pZivIIbQHkaXSHwS6LRPAISp1)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FrM-hlR0jd2nQpnmA1ijYDxyybnO)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FuWrwTo417GvOT-JMqYICkcs6Kbw)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/Fow8dCq3qwv9j_cV21Qw7ok8UwMT)','http://so6b4f8dg.hn-bkt.clouddn.com/Fs-kSTsnYqlIlGC6qwkgmG8y_B9G',2,1,1,NULL,'2024-12-20 16:48:17','2024-12-20 16:48:17',21,'MQ(RabbitMQ)',6,0,NULL),(73,'ElasticSearch+kibana',522,5,'\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FoTZimCg5kG9EVdiky8cRiESEtmq)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FuvGHYRlRxi0vHYw1zXv-W0V3dQO)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FvpQYcKLD2KI6XtTMIzhwWZGAFow)![](http://so6b4f8dg.hn-bkt.clouddn.com/FomoKiV-v5T1ucoOhS-NuriYaH_x)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FvKGdvTbHYd9AGU8NjZ36i3-9oKl)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FjLghDWJzZsnoJlI-jLXgESCLWTQ)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FtRcPm_7t_Rw5KotNOXx2dSgn3Wh)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/Fpygzl7wPGiL055_ZxD5h8hYR94A)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FrpW0-stf8kvV-StyRKU7prWjLbj)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FmekPSKJ-HKHidjh_XU8ya-FdpI8)\n','http://so6b4f8dg.hn-bkt.clouddn.com/FvUkyz9tDjSEz6Y4nM5UvU7U_2cX',2,1,1,NULL,'2024-12-20 16:52:01','2024-12-20 16:52:01',21,'ElasticSearch+kibana',6,0,NULL),(74,'Redis应用篇',522,5,'![](http://so6b4f8dg.hn-bkt.clouddn.com/Fif0a1a6k_1V452tws_YXt6iiFLs)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/Fkgi7QhF-fhG6aY_qkbYbDz8uO9s)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/Ft42zOWI-rHibItDjjG8ofYbb38d)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/Fuv6Lcr_wLUDxPqa0F04PZ0xgPTm)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/Fu_m7somSQXlxW79CO-V3v9dvEvf)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FiHc7pBPHnnF2a4Y4atQhCP51pHT)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FgryAQhKYNgeGiOqaK9LyUVoigls)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FqVWZ95NAUczZk4pqt4F7je9cE7V)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FvZAj5GRV20yqnZ4FrbABxxXokCU)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/Fq9bvWkNlXyK228OT2Cg2kTO7nnN)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FnVrRVMnMeC31grrYlv8fiJ0G87Z)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FkwgIzJ43siU75tkJ8NZbL04Nbj7)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FtFEyUrN4HFQ13CIe40Zu59No57G)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FkxtFzRV9ynaqCbwg2VbTbDfb1tq)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FirB2nUUeX0udXdj_OdTykaQ9Wf9)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/Fq8aMmwM-57h0PnORv_isGJe3XIQ)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FhP_q3xpM_1CWO8V89JqZxLgwOsS)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FrcTmB5zGCaF5RvkoW2OE1EPBeCU)\n','http://so6b4f8dg.hn-bkt.clouddn.com/FhY_hixkPrU8oZgT5n9-e7RG9Byn',2,1,1,NULL,'2024-12-20 16:57:55','2024-12-20 16:57:55',21,'Redis应用篇',6,0,NULL),(75,'Redis面试原理篇',522,5,'**//TODO集群部署done,高级原理篇打个欠条(面试统一整理去了)**\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FrHRpH__XQIWTuXrI1HBB8Oq8Xo4)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/Fi9QHVnlHgTculD0pFFVaF5etgdR)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/Fq_RGO4xxwIgRtNZ2pfte5vb0Mvg)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FhwBKjasIqMQV-hVrlHZftpVQQn4)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FuSjc9gJWPmXktjEyxmQdvUFO6t8)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/Fsw1Iku4CmZjpoC2-m5W18AWY4FX)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FjeCzs1e_zEjXbDrjt5pbFG0IK6J)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/Fpa4mtNOAKUlGb0z6REFRFhoMewb)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FgVrvryvrJZS_TMNlevECOT6luuN)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FjBfikxoNCYTNMzeTrecozQhOBbh)\n','http://so6b4f8dg.hn-bkt.clouddn.com/Fn3BtOXbngGSKydmvDIgVNSLqeYe',2,1,1,NULL,'2024-12-20 17:03:16','2024-12-20 17:06:38',21,'Redis面试原理篇',6,16332,NULL),(76,'RuoYi框架',522,5,'**大好人整理的笔记,撒泡尿标个点[RuoYi框架笔记(伏笔嗷,天机学堂笔记也有)](https://www.yuque.com/caoshuyao/java-project/sq5o9bv5so7rexyk)**','http://so6b4f8dg.hn-bkt.clouddn.com/Fseg3MsISDrREZC4d1LpZvxulV9w',2,1,1,NULL,'2024-12-20 16:27:18','2024-12-20 17:32:24',8,'RuoYi(CRUD终结者,快速搭建管理前端和后端项目)',6,0,NULL),(77,'数据库设计和MySQL调优',522,9,'![](http://so6b4f8dg.hn-bkt.clouddn.com/FmmpJlYfS_klDqcSZPxdt06NWTko)\n![](http://so6b4f8dg.hn-bkt.clouddn.com/FseF4Lr69oEvOBGsj-S6ebHzS6oE)\n','http://so6b4f8dg.hn-bkt.clouddn.com/FtsQhfk1lF2KpqNQuCK5NjMBzH2q',2,1,1,NULL,'2024-12-20 17:25:23','2024-12-20 17:25:23',22,'数据库设计和MySQL调优',6,0,NULL);
/*!40000 ALTER TABLE `blog_article` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `blog_article_tag`
--

DROP TABLE IF EXISTS `blog_article_tag`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `blog_article_tag` (
  `id` int NOT NULL AUTO_INCREMENT,
  `article_id` int DEFAULT NULL COMMENT '文章id',
  `tag_id` int DEFAULT NULL COMMENT '标签id',
  `createdAt` datetime DEFAULT NULL,
  `updatedAt` datetime DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=392 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `blog_article_tag`
--

LOCK TABLES `blog_article_tag` WRITE;
/*!40000 ALTER TABLE `blog_article_tag` DISABLE KEYS */;
INSERT INTO `blog_article_tag` (`id`, `article_id`, `tag_id`, `createdAt`, `updatedAt`) VALUES (357,38,25,'2024-12-19 16:31:14','2024-12-19 16:31:14'),(361,57,25,'2024-12-19 17:15:45','2024-12-19 17:15:45'),(362,39,25,'2024-12-19 17:18:05','2024-12-19 17:18:05'),(363,58,24,'2024-12-20 08:47:48','2024-12-20 08:47:48'),(364,59,25,'2024-12-20 08:50:12','2024-12-20 08:50:12'),(366,61,25,'2024-12-20 08:53:57','2024-12-20 08:53:57'),(367,64,25,'2024-12-20 09:06:46','2024-12-20 09:06:46'),(372,65,25,'2024-12-20 09:30:56','2024-12-20 09:30:56'),(374,66,25,'2024-12-20 15:45:41','2024-12-20 15:45:41'),(376,60,25,'2024-12-20 15:52:10','2024-12-20 15:52:10'),(377,67,25,'2024-12-20 15:55:53','2024-12-20 15:55:53'),(379,37,24,'2024-12-20 15:59:45','2024-12-20 15:59:45'),(380,68,25,'2024-12-20 16:02:49','2024-12-20 16:02:49'),(381,69,25,'2024-12-20 16:22:04','2024-12-20 16:22:04'),(382,70,25,'2024-12-20 16:25:46','2024-12-20 16:25:46'),(383,71,25,'2024-12-20 16:44:38','2024-12-20 16:44:38'),(384,72,25,'2024-12-20 16:48:17','2024-12-20 16:48:17'),(385,73,25,'2024-12-20 16:52:01','2024-12-20 16:52:01'),(386,74,25,'2024-12-20 16:57:55','2024-12-20 16:57:55'),(388,75,25,'2024-12-20 17:06:38','2024-12-20 17:06:38'),(390,77,25,'2024-12-20 17:25:23','2024-12-20 17:25:23'),(391,76,25,'2024-12-20 17:32:24','2024-12-20 17:32:24');
/*!40000 ALTER TABLE `blog_article_tag` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `blog_category`
--

DROP TABLE IF EXISTS `blog_category`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `blog_category` (
  `id` int NOT NULL AUTO_INCREMENT,
  `category_name` varchar(55) DEFAULT NULL COMMENT '分类名称 唯一',
  `createdAt` datetime DEFAULT NULL,
  `updatedAt` datetime DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `category_name` (`category_name`) USING BTREE,
  UNIQUE KEY `category_name_2` (`category_name`) USING BTREE,
  UNIQUE KEY `category_name_3` (`category_name`) USING BTREE,
  UNIQUE KEY `category_name_4` (`category_name`) USING BTREE,
  UNIQUE KEY `category_name_5` (`category_name`) USING BTREE,
  UNIQUE KEY `category_name_6` (`category_name`) USING BTREE,
  UNIQUE KEY `category_name_7` (`category_name`) USING BTREE,
  UNIQUE KEY `category_name_8` (`category_name`) USING BTREE,
  UNIQUE KEY `category_name_9` (`category_name`) USING BTREE,
  UNIQUE KEY `category_name_10` (`category_name`) USING BTREE,
  UNIQUE KEY `category_name_11` (`category_name`) USING BTREE,
  UNIQUE KEY `category_name_12` (`category_name`) USING BTREE,
  UNIQUE KEY `category_name_13` (`category_name`) USING BTREE,
  UNIQUE KEY `category_name_14` (`category_name`) USING BTREE,
  UNIQUE KEY `category_name_15` (`category_name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `blog_category`
--

LOCK TABLES `blog_category` WRITE;
/*!40000 ALTER TABLE `blog_category` DISABLE KEYS */;
INSERT INTO `blog_category` (`id`, `category_name`, `createdAt`, `updatedAt`) VALUES (5,'后端开发','2024-12-09 08:31:24','2024-12-09 08:31:24'),(6,'运维部署','2024-12-09 08:31:58','2024-12-09 08:32:45'),(7,'前端开发','2024-12-09 08:32:06','2024-12-09 08:32:06'),(8,'视觉设计','2024-12-09 08:32:29','2024-12-09 08:32:29'),(9,'接口设计','2024-12-09 08:33:04','2024-12-09 08:33:04');
/*!40000 ALTER TABLE `blog_category` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `blog_chat`
--

DROP TABLE IF EXISTS `blog_chat`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `blog_chat` (
  `id` int NOT NULL AUTO_INCREMENT,
  `user_id` int DEFAULT NULL COMMENT '用户id 用于判断是谁发送的',
  `content` varchar(555) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '聊天内容',
  `createdAt` datetime DEFAULT NULL,
  `updatedAt` datetime DEFAULT NULL,
  `content_type` varchar(55) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '聊天的内容格式 如果是文本就是text 图片就是 img',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=214 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `blog_chat`
--

LOCK TABLES `blog_chat` WRITE;
/*!40000 ALTER TABLE `blog_chat` DISABLE KEYS */;
/*!40000 ALTER TABLE `blog_chat` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `blog_comment`
--

DROP TABLE IF EXISTS `blog_comment`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `blog_comment` (
  `id` int NOT NULL AUTO_INCREMENT,
  `parent_id` int DEFAULT NULL COMMENT '评论父级id',
  `for_id` int DEFAULT NULL COMMENT '评论的对象id 比如说说id、文章id等',
  `type` int DEFAULT NULL COMMENT '评论类型 1 文章 2 说说 3 留言 ...',
  `from_id` int DEFAULT NULL COMMENT '评论人id',
  `from_name` varchar(255) DEFAULT NULL COMMENT '评论人昵称',
  `from_avatar` varchar(555) DEFAULT NULL COMMENT '评论人头像',
  `to_id` int DEFAULT NULL COMMENT '被回复的人id',
  `to_name` varchar(255) DEFAULT NULL COMMENT '被回复人的昵称',
  `to_avatar` varchar(555) DEFAULT NULL COMMENT '被回复人的头像',
  `content` varchar(555) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '评论内容',
  `thumbs_up` int DEFAULT '0' COMMENT '评论点赞数',
  `createdAt` datetime DEFAULT NULL,
  `updatedAt` datetime DEFAULT NULL,
  `ip` varchar(255) DEFAULT NULL COMMENT 'ip地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=489 DEFAULT CHARSET=utf8mb3;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `blog_comment`
--

LOCK TABLES `blog_comment` WRITE;
/*!40000 ALTER TABLE `blog_comment` DISABLE KEYS */;
/*!40000 ALTER TABLE `blog_comment` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `blog_config`
--

DROP TABLE IF EXISTS `blog_config`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `blog_config` (
  `id` int NOT NULL AUTO_INCREMENT,
  `blog_name` varchar(55) DEFAULT '小张的博客' COMMENT '博客名称',
  `blog_avatar` varchar(255) DEFAULT 'https://mrzym.gitee.io/blogimg/html/rabbit.png' COMMENT '博客头像',
  `avatar_bg` varchar(255) DEFAULT NULL COMMENT '博客头像背景图',
  `personal_say` varchar(255) DEFAULT NULL COMMENT '个人签名',
  `blog_notice` varchar(255) DEFAULT NULL COMMENT '博客公告',
  `qq_link` varchar(255) DEFAULT NULL COMMENT 'qq链接',
  `we_chat_link` varchar(255) DEFAULT NULL COMMENT '微信链接',
  `github_link` varchar(255) DEFAULT NULL COMMENT 'github链接',
  `git_ee_link` varchar(255) DEFAULT NULL COMMENT 'git_ee链接',
  `bilibili_link` varchar(255) DEFAULT NULL COMMENT 'bilibili链接',
  `view_time` bigint DEFAULT '0' COMMENT '博客被访问的次数',
  `createdAt` datetime DEFAULT NULL,
  `updatedAt` datetime DEFAULT NULL,
  `we_chat_group` varchar(255) DEFAULT NULL COMMENT '微信群图片',
  `qq_group` varchar(255) DEFAULT NULL COMMENT 'qq群图片',
  `we_chat_pay` varchar(255) DEFAULT NULL COMMENT '微信收款码',
  `ali_pay` varchar(255) DEFAULT NULL COMMENT '支付宝收款码',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `blog_config`
--

LOCK TABLES `blog_config` WRITE;
/*!40000 ALTER TABLE `blog_config` DISABLE KEYS */;
INSERT INTO `blog_config` (`id`, `blog_name`, `blog_avatar`, `avatar_bg`, `personal_say`, `blog_notice`, `qq_link`, `we_chat_link`, `github_link`, `git_ee_link`, `bilibili_link`, `view_time`, `createdAt`, `updatedAt`, `we_chat_group`, `qq_group`, `we_chat_pay`, `ali_pay`) VALUES (1,'IOJAM','http://so6b4f8dg.hn-bkt.clouddn.com/Fj-f9JbVLt59lBwRb4P9Sk7s0P8j','http://so6b4f8dg.hn-bkt.clouddn.com/FjHeAPlKlFg_ZhWEWWrXZfTzoTZG','小火慢熬的粥','啊,想着博客数据量不大,就不加定时任务导出数据库了,BUT......Docker崩了,习惯性把容器删了,数据库库数据没有导出,导致数据丢失了,只能用测试数据了','http://so6b4f8dg.hn-bkt.clouddn.com/Fs2wimlImqd_2U8kSy-iL1OYjaY-','','https://github.com/iojam5578','https://gitee.com/iojam','https://space.bilibili.com/3546572885329939',575,'2024-12-08 18:52:27','2024-12-20 18:00:09','','','','');
/*!40000 ALTER TABLE `blog_config` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `blog_header`
--

DROP TABLE IF EXISTS `blog_header`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `blog_header` (
  `id` int NOT NULL AUTO_INCREMENT,
  `bg_url` varchar(255) DEFAULT NULL COMMENT '背景图',
  `createdAt` datetime DEFAULT NULL,
  `updatedAt` datetime DEFAULT NULL,
  `route_name` varchar(555) DEFAULT NULL COMMENT '路由名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8mb3;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `blog_header`
--

LOCK TABLES `blog_header` WRITE;
/*!40000 ALTER TABLE `blog_header` DISABLE KEYS */;
INSERT INTO `blog_header` (`id`, `bg_url`, `createdAt`, `updatedAt`, `route_name`) VALUES (32,'http://so6b4f8dg.hn-bkt.clouddn.com/Fi8lXwQ6AS0sAzLNOi2lTslxDlCY','2024-12-09 00:02:32','2024-12-09 00:05:49','Archives'),(34,'http://so6b4f8dg.hn-bkt.clouddn.com/Fh1XXJSJ3dKKp65VDQaEhW4JVV66','2024-12-09 07:56:28','2024-12-20 09:38:28','Home'),(35,'http://so6b4f8dg.hn-bkt.clouddn.com/Fu3kpn1kWJLERM5KHB5qiJ3iqNtk','2024-12-20 09:38:51','2024-12-20 09:38:51','ArticleList'),(36,'http://so6b4f8dg.hn-bkt.clouddn.com/FujDjDCiWkyKc1CzUauNgnYeb8kD','2024-12-20 17:36:30','2024-12-20 17:36:30','PhotoAlbum'),(37,'http://so6b4f8dg.hn-bkt.clouddn.com/Fnui6eam46lLBeohvu_ICHEmtnL2','2024-12-20 17:37:04','2024-12-20 17:37:04','Talk'),(38,'http://so6b4f8dg.hn-bkt.clouddn.com/Fu0ru3K42bYtdTxkyS_mK7soPFRg','2024-12-20 17:37:24','2024-12-20 17:39:18','Category'),(39,'http://so6b4f8dg.hn-bkt.clouddn.com/Fj-IeFz_B_InG9WOsMXt0U-wG4pV','2024-12-20 17:37:58','2024-12-20 17:37:58','Back'),(40,'http://so6b4f8dg.hn-bkt.clouddn.com/Fsx3ulOIZj3ybsWpImOwujrPkZ4X','2024-12-20 17:38:23','2024-12-20 17:38:23','Front');
/*!40000 ALTER TABLE `blog_header` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `blog_like`
--

DROP TABLE IF EXISTS `blog_like`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `blog_like` (
  `id` int NOT NULL AUTO_INCREMENT,
  `type` int DEFAULT NULL COMMENT '点赞类型 1 文章 2 说说 3 留言 4 评论',
  `for_id` int DEFAULT NULL COMMENT '点赞的id 文章id 说说id 留言id',
  `user_id` int DEFAULT NULL COMMENT '点赞用户id',
  `createdAt` datetime DEFAULT NULL,
  `updatedAt` datetime DEFAULT NULL,
  `ip` varchar(255) DEFAULT NULL COMMENT '点赞ip',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=932 DEFAULT CHARSET=utf8mb3;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `blog_like`
--

LOCK TABLES `blog_like` WRITE;
/*!40000 ALTER TABLE `blog_like` DISABLE KEYS */;
INSERT INTO `blog_like` (`id`, `type`, `for_id`, `user_id`, `createdAt`, `updatedAt`, `ip`) VALUES (931,1,39,522,'2024-12-20 17:43:19','2024-12-20 17:43:19',NULL);
/*!40000 ALTER TABLE `blog_like` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `blog_links`
--

DROP TABLE IF EXISTS `blog_links`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `blog_links` (
  `id` int NOT NULL AUTO_INCREMENT,
  `site_name` varchar(55) DEFAULT NULL COMMENT '网站名称',
  `site_desc` varchar(255) DEFAULT NULL COMMENT '网站描述',
  `site_avatar` varchar(555) DEFAULT NULL COMMENT '网站头像',
  `url` varchar(255) DEFAULT NULL COMMENT '网站地址',
  `status` int DEFAULT NULL COMMENT '友链状态 1 待审核 2 审核通过',
  `createdAt` datetime DEFAULT NULL,
  `updatedAt` datetime DEFAULT NULL,
  `user_id` varchar(255) DEFAULT NULL COMMENT '申请者id',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8mb3;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `blog_links`
--

LOCK TABLES `blog_links` WRITE;
/*!40000 ALTER TABLE `blog_links` DISABLE KEYS */;
/*!40000 ALTER TABLE `blog_links` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `blog_message`
--

DROP TABLE IF EXISTS `blog_message`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `blog_message` (
  `id` int NOT NULL AUTO_INCREMENT,
  `tag` varchar(255) DEFAULT NULL COMMENT '标签',
  `message` varchar(555) DEFAULT NULL COMMENT '留言内容',
  `color` varchar(255) DEFAULT '#676767' COMMENT '字体颜色',
  `font_size` int DEFAULT '12' COMMENT '字体大小',
  `bg_color` varchar(255) DEFAULT NULL COMMENT '背景颜色',
  `bg_url` varchar(255) DEFAULT NULL COMMENT '背景图片',
  `user_id` int DEFAULT NULL COMMENT '留言用户的id',
  `like_times` int DEFAULT '0' COMMENT '点赞次数',
  `createdAt` datetime DEFAULT NULL,
  `updatedAt` datetime DEFAULT NULL,
  `font_weight` int DEFAULT '500' COMMENT '字体宽度',
  `nick_name` varchar(255) DEFAULT NULL COMMENT '游客用户的昵称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3586 DEFAULT CHARSET=utf8mb3;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `blog_message`
--

LOCK TABLES `blog_message` WRITE;
/*!40000 ALTER TABLE `blog_message` DISABLE KEYS */;
INSERT INTO `blog_message` (`id`, `tag`, `message`, `color`, `font_size`, `bg_color`, `bg_url`, `user_id`, `like_times`, `createdAt`, `updatedAt`, `font_weight`, `nick_name`) VALUES (3468,'赞不绝口','锦鲤附体','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3469,'赞不绝口','考的都会,蒙的对的','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3470,'赞不绝口','成功上岸','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3471,'赞不绝口','~o( =∩ω∩= )m~','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3472,'赞不绝口','嗷嗷嗷','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3473,'赞不绝口','小问题没什么大不了','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3474,'赞不绝口','锦鲤附体','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3475,'赞不绝口','考的都会,蒙的对的','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3476,'赞不绝口','成功上岸','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3477,'赞不绝口','~o( =∩ω∩= )m~','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3478,'赞不绝口','嗷嗷嗷','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3479,'赞不绝口','小问题没什么大不了','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3480,'赞不绝口','锦鲤附体','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3481,'赞不绝口','考的都会,蒙的对的','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3482,'赞不绝口','成功上岸','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3483,'赞不绝口','~o( =∩ω∩= )m~','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3484,'赞不绝口','嗷嗷嗷','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3485,'赞不绝口','小问题没什么大不了','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3486,'赞不绝口','锦鲤附体','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3487,'赞不绝口','考的都会,蒙的对的','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3488,'赞不绝口','成功上岸','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3489,'赞不绝口','~o( =∩ω∩= )m~','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3490,'赞不绝口','嗷嗷嗷','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3491,'赞不绝口','小问题没什么大不了','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3492,'赞不绝口','锦鲤附体','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3493,'赞不绝口','考的都会,蒙的对的','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3494,'赞不绝口','成功上岸','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3495,'赞不绝口','~o( =∩ω∩= )m~','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3496,'赞不绝口','嗷嗷嗷','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3497,'赞不绝口','小问题没什么大不了','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3498,'赞不绝口','考的都会,蒙的对的','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3499,'赞不绝口','成功上岸','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3500,'赞不绝口','~o( =∩ω∩= )m~','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3501,'赞不绝口','嗷嗷嗷','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3502,'赞不绝口','小问题没什么大不了','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3503,'赞不绝口','锦鲤附体','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3504,'赞不绝口','考的都会,蒙的对的','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3505,'赞不绝口','成功上岸','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3506,'赞不绝口','~o( =∩ω∩= )m~','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3507,'赞不绝口','嗷嗷嗷','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3508,'赞不绝口','小问题没什么大不了','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3509,'赞不绝口','锦鲤附体','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3510,'赞不绝口','考的都会,蒙的对的','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3511,'赞不绝口','成功上岸','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3512,'赞不绝口','~o( =∩ω∩= )m~','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3513,'赞不绝口','嗷嗷嗷','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3514,'赞不绝口','小问题没什么大不了','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3515,'赞不绝口','锦鲤附体','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3516,'赞不绝口','考的都会,蒙的对的','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3517,'赞不绝口','成功上岸','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3518,'赞不绝口','~o( =∩ω∩= )m~','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3519,'赞不绝口','嗷嗷嗷','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3520,'赞不绝口','小问题没什么大不了','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3521,'赞不绝口','锦鲤附体','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3522,'赞不绝口','考的都会,蒙的对的','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3523,'赞不绝口','成功上岸','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3524,'赞不绝口','~o( =∩ω∩= )m~','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3525,'赞不绝口','嗷嗷嗷','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3526,'赞不绝口','小问题没什么大不了','',16,'transparent','',522,0,'2024-12-18 11:18:53','2024-12-18 11:18:53',500,'iojam'),(3527,'赞不绝口','锦鲤附体','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3528,'赞不绝口','考的都会,蒙的对的','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3529,'赞不绝口','成功上岸','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3530,'赞不绝口','~o( =∩ω∩= )m~','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3531,'赞不绝口','嗷嗷嗷','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3532,'赞不绝口','考试成功','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3533,'赞不绝口','锦鲤附体','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3534,'赞不绝口','考的都会,蒙的对的','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3535,'赞不绝口','成功上岸','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3536,'赞不绝口','~o( =∩ω∩= )m~','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3537,'赞不绝口','嗷嗷嗷','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3538,'赞不绝口','考试成功','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3539,'赞不绝口','锦鲤附体','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3540,'赞不绝口','考的都会,蒙的对的','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3541,'赞不绝口','成功上岸','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3542,'赞不绝口','~o( =∩ω∩= )m~','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3543,'赞不绝口','嗷嗷嗷','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3544,'赞不绝口','考试成功','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3545,'赞不绝口','锦鲤附体','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3546,'赞不绝口','考的都会,蒙的对的','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3547,'赞不绝口','成功上岸','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3548,'赞不绝口','~o( =∩ω∩= )m~','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3549,'赞不绝口','嗷嗷嗷','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3550,'赞不绝口','考试成功','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3551,'赞不绝口','锦鲤附体','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3552,'赞不绝口','考的都会,蒙的对的','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3553,'赞不绝口','成功上岸','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3554,'赞不绝口','~o( =∩ω∩= )m~','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3555,'赞不绝口','嗷嗷嗷','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3556,'赞不绝口','考试成功','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3557,'赞不绝口','考的都会,蒙的对的','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3558,'赞不绝口','成功上岸','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3559,'赞不绝口','~o( =∩ω∩= )m~','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3560,'赞不绝口','嗷嗷嗷','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3561,'赞不绝口','考试成功','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3562,'赞不绝口','锦鲤附体','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3563,'赞不绝口','考的都会,蒙的对的','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3564,'赞不绝口','成功上岸','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3565,'赞不绝口','~o( =∩ω∩= )m~','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3566,'赞不绝口','嗷嗷嗷','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3567,'赞不绝口','考试成功','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3568,'赞不绝口','锦鲤附体','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3569,'赞不绝口','考的都会,蒙的对的','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3570,'赞不绝口','成功上岸','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3571,'赞不绝口','~o( =∩ω∩= )m~','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3572,'赞不绝口','嗷嗷嗷','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3573,'赞不绝口','考试成功','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3574,'赞不绝口','锦鲤附体','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3575,'赞不绝口','考的都会,蒙的对的','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3576,'赞不绝口','成功上岸','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3577,'赞不绝口','~o( =∩ω∩= )m~','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3578,'赞不绝口','嗷嗷嗷','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3579,'赞不绝口','考试成功','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3580,'赞不绝口','锦鲤附体','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3581,'赞不绝口','考的都会,蒙的对的','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3582,'赞不绝口','成功上岸','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3583,'赞不绝口','~o( =∩ω∩= )m~','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3584,'赞不绝口','嗷嗷嗷','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam'),(3585,'赞不绝口','考试成功','',16,'transparent','',522,0,'2024-12-18 11:20:31','2024-12-18 11:20:31',500,'iojam');
/*!40000 ALTER TABLE `blog_message` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `blog_notify`
--

DROP TABLE IF EXISTS `blog_notify`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `blog_notify` (
  `id` int NOT NULL AUTO_INCREMENT,
  `message` varchar(555) DEFAULT NULL COMMENT '通知内容',
  `user_id` int DEFAULT NULL COMMENT '通知给谁',
  `type` int DEFAULT NULL COMMENT '通知类型 1 文章 2 说说 3 留言 4 友链',
  `to_id` int DEFAULT NULL COMMENT '说说或者是文章的id 用于跳转',
  `isView` int DEFAULT '1' COMMENT '是否被查看 1 没有 2 已经查看',
  `createdAt` datetime DEFAULT NULL,
  `updatedAt` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3842 DEFAULT CHARSET=utf8mb3;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `blog_notify`
--

LOCK TABLES `blog_notify` WRITE;
/*!40000 ALTER TABLE `blog_notify` DISABLE KEYS */;
INSERT INTO `blog_notify` (`id`, `message`, `user_id`, `type`, `to_id`, `isView`, `createdAt`, `updatedAt`) VALUES (3839,'您收到了来自于：游客q6781 的留言: test！',1,3,NULL,1,'2024-12-08 23:07:30','2024-12-08 23:07:30'),(3840,'您收到了来自于：游客tf39w 的留言: nobody care！',1,3,NULL,1,'2024-12-08 23:07:43','2024-12-08 23:07:43'),(3841,'您收到了来自于：iojam 的留言: 123！',1,3,NULL,1,'2024-12-18 11:07:12','2024-12-18 11:07:12');
/*!40000 ALTER TABLE `blog_notify` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `blog_photo`
--

DROP TABLE IF EXISTS `blog_photo`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `blog_photo` (
  `id` int NOT NULL AUTO_INCREMENT,
  `album_id` int DEFAULT NULL COMMENT '相册 id 属于哪个相册',
  `url` varchar(555) DEFAULT NULL COMMENT '图片地址',
  `status` int DEFAULT '1' COMMENT '状态 1 正常 2 回收站',
  `createdAt` datetime DEFAULT NULL,
  `updatedAt` datetime DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=329 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `blog_photo`
--

LOCK TABLES `blog_photo` WRITE;
/*!40000 ALTER TABLE `blog_photo` DISABLE KEYS */;
INSERT INTO `blog_photo` (`id`, `album_id`, `url`, `status`, `createdAt`, `updatedAt`) VALUES (309,10,'http://so6b4f8dg.hn-bkt.clouddn.com/Fis1hkKo7ZIW1p6DJiEP8X35oaRE',2,'2024-12-09 00:30:22','2024-12-09 00:34:32'),(310,10,'http://so6b4f8dg.hn-bkt.clouddn.com/Fu8nN1iOonjMYdmSRl01Hf7Rs7pt',1,'2024-12-09 00:30:22','2024-12-09 00:30:22'),(311,10,'http://so6b4f8dg.hn-bkt.clouddn.com/FoJBEAMtolxP7OSWnk0esmYqEOF_',1,'2024-12-09 00:30:22','2024-12-09 00:30:22'),(312,10,'http://so6b4f8dg.hn-bkt.clouddn.com/Fhysp_DWmrlLCmPi8acitRvy5JbQ',1,'2024-12-09 00:30:22','2024-12-09 00:30:22'),(313,10,'http://so6b4f8dg.hn-bkt.clouddn.com/FibQCiI6BV8d4z-1azvPCxJmT11a',1,'2024-12-09 00:30:22','2024-12-09 00:30:22'),(314,10,'http://so6b4f8dg.hn-bkt.clouddn.com/Fgxp__Q67PYRN_9LPKgKED5ppesb',1,'2024-12-09 00:30:22','2024-12-09 00:30:22'),(315,10,'http://so6b4f8dg.hn-bkt.clouddn.com/FtPdTrMl2UOuZ_Tel03gH8EOvIG7',1,'2024-12-09 00:30:22','2024-12-09 00:30:22'),(316,10,'http://so6b4f8dg.hn-bkt.clouddn.com/Fpyk7wlQHr_ZBlHB5JZpD8IlTdTY',1,'2024-12-09 00:30:22','2024-12-09 00:30:22'),(317,10,'http://so6b4f8dg.hn-bkt.clouddn.com/FsJgFJuvm-mR0k1Z07ag6SahAP4s',1,'2024-12-09 00:30:22','2024-12-09 00:30:22'),(318,10,'http://so6b4f8dg.hn-bkt.clouddn.com/Fpyk7wlQHr_ZBlHB5JZpD8IlTdTY',2,'2024-12-09 00:34:40','2024-12-09 07:41:51'),(319,10,'http://so6b4f8dg.hn-bkt.clouddn.com/FrKSc_JHN6Na6nyY5m4US-wezh3R',1,'2024-12-09 07:44:22','2024-12-09 07:44:22'),(320,10,'http://so6b4f8dg.hn-bkt.clouddn.com/Fs4YRvhER7fA0Jt5WhIL2dVWcpwF',1,'2024-12-09 07:44:22','2024-12-09 07:44:22'),(321,11,'http://so6b4f8dg.hn-bkt.clouddn.com/FsFwDWZ1OIHVE3qQ3hweMDepZMrh',1,'2024-12-09 07:47:38','2024-12-09 07:47:38'),(322,11,'http://so6b4f8dg.hn-bkt.clouddn.com/FmOx_6dHtYnI0_CyiueSqAm9Ot2b',1,'2024-12-09 07:47:38','2024-12-09 07:47:38'),(323,11,'http://so6b4f8dg.hn-bkt.clouddn.com/FjIlA6gNbCYhH89T4msqKYtQbq70',1,'2024-12-09 07:47:38','2024-12-09 07:47:38'),(324,11,'http://so6b4f8dg.hn-bkt.clouddn.com/FiCKgPXoqDGWyuXw3ozZ6r7E8Zb9',1,'2024-12-09 07:47:38','2024-12-09 07:47:38'),(325,11,'http://so6b4f8dg.hn-bkt.clouddn.com/FhltcDFIQj2mYMR4VlY4W_o6ipKb',1,'2024-12-09 07:47:38','2024-12-09 07:47:38'),(326,11,'http://so6b4f8dg.hn-bkt.clouddn.com/FrpbJ56SPH8Yd7T8uxkz9hI7PEPN',1,'2024-12-09 07:47:38','2024-12-09 07:47:38'),(327,11,'http://so6b4f8dg.hn-bkt.clouddn.com/Fod1EmqD4qVcNKm529A6OrYIvVOj',1,'2024-12-09 07:47:38','2024-12-09 07:47:38'),(328,11,'http://so6b4f8dg.hn-bkt.clouddn.com/FsnhcM4_JE3lO6K5ou5plepRDO8X',1,'2024-12-09 07:47:38','2024-12-09 07:47:38');
/*!40000 ALTER TABLE `blog_photo` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `blog_photo_album`
--

DROP TABLE IF EXISTS `blog_photo_album`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `blog_photo_album` (
  `id` int NOT NULL AUTO_INCREMENT,
  `album_name` varchar(26) DEFAULT NULL COMMENT '相册名称',
  `description` varchar(55) DEFAULT NULL COMMENT '相册描述信息',
  `createdAt` datetime DEFAULT NULL,
  `updatedAt` datetime DEFAULT NULL,
  `album_cover` varchar(555) DEFAULT NULL COMMENT '相册封面',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `blog_photo_album`
--

LOCK TABLES `blog_photo_album` WRITE;
/*!40000 ALTER TABLE `blog_photo_album` DISABLE KEYS */;
INSERT INTO `blog_photo_album` (`id`, `album_name`, `description`, `createdAt`, `updatedAt`, `album_cover`) VALUES (10,'晚安世界','异世我,亦是我','2024-12-09 00:09:37','2024-12-09 00:09:37','http://so6b4f8dg.hn-bkt.clouddn.com/Fiy0M5ZRG53zcGEnCf1ETPA2FlSL'),(11,'悠哉日常大王','喵帕斯,没烦恼','2024-12-09 00:15:36','2024-12-09 00:15:36','http://so6b4f8dg.hn-bkt.clouddn.com/Fi8lXwQ6AS0sAzLNOi2lTslxDlCY');
/*!40000 ALTER TABLE `blog_photo_album` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `blog_recommend`
--

DROP TABLE IF EXISTS `blog_recommend`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `blog_recommend` (
  `id` int NOT NULL AUTO_INCREMENT,
  `title` varchar(55) DEFAULT NULL COMMENT '推荐网站标题',
  `link` varchar(255) DEFAULT NULL COMMENT '网站地址',
  `createdAt` datetime DEFAULT NULL,
  `updatedAt` datetime DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `blog_recommend`
--

LOCK TABLES `blog_recommend` WRITE;
/*!40000 ALTER TABLE `blog_recommend` DISABLE KEYS */;
/*!40000 ALTER TABLE `blog_recommend` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `blog_tag`
--

DROP TABLE IF EXISTS `blog_tag`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `blog_tag` (
  `id` int NOT NULL AUTO_INCREMENT,
  `tag_name` varchar(55) DEFAULT NULL COMMENT '标签名称 唯一',
  `createdAt` datetime DEFAULT NULL,
  `updatedAt` datetime DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `tag_name` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_2` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_3` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_4` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_5` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_6` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_7` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_8` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_9` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_10` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_11` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_12` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_13` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_14` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_15` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_16` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_17` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_18` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_19` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_20` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_21` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_22` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_23` (`tag_name`) USING BTREE,
  UNIQUE KEY `tag_name_24` (`tag_name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `blog_tag`
--

LOCK TABLES `blog_tag` WRITE;
/*!40000 ALTER TABLE `blog_tag` DISABLE KEYS */;
INSERT INTO `blog_tag` (`id`, `tag_name`, `createdAt`, `updatedAt`) VALUES (23,'☆','2024-12-09 08:34:19','2024-12-09 08:34:19'),(24,'☆☆☆','2024-12-09 08:34:25','2024-12-09 08:34:33'),(25,'☆☆☆☆☆','2024-12-09 08:34:30','2024-12-09 08:34:30');
/*!40000 ALTER TABLE `blog_tag` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `blog_talk`
--

DROP TABLE IF EXISTS `blog_talk`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `blog_talk` (
  `id` int NOT NULL AUTO_INCREMENT,
  `user_id` int DEFAULT NULL COMMENT '发布说说的用户id',
  `content` varchar(255) DEFAULT NULL COMMENT '说说内容',
  `status` int DEFAULT '1' COMMENT '说说状态 1 公开 2 私密 3 回收站',
  `is_top` int DEFAULT '2' COMMENT '是否置顶 1 置顶 2 不置顶',
  `like_times` int DEFAULT '0' COMMENT '点赞次数',
  `createdAt` datetime DEFAULT NULL,
  `updatedAt` datetime DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=68 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `blog_talk`
--

LOCK TABLES `blog_talk` WRITE;
/*!40000 ALTER TABLE `blog_talk` DISABLE KEYS */;
INSERT INTO `blog_talk` (`id`, `user_id`, `content`, `status`, `is_top`, `like_times`, `createdAt`, `updatedAt`) VALUES (62,522,'喵的,之前系统重装了,JAVAEE,JQuery等等远古学习笔记全没了,现在还记得JQuery和手搓tomcat的痛苦!!!!',1,2,0,'2024-12-09 09:01:41','2024-12-09 09:02:00'),(63,522,'啊,想着博客数据量不大,就不加定时任务导出数据库了,BUT......Docker崩了,习惯性把容器删了,数据库库数据没有导出,导致数据丢失了,只能用测试数据了',1,2,0,'2024-12-18 10:43:46','2024-12-18 11:00:23'),(64,522,'//TODO \n1.Redis全套（12天）  \n3.学成在线（14天） \n4.百度地图（14天） \n5.ruoyiPro（下学期手搓淘宝）',1,2,0,'2024-12-12 17:06:21','2024-12-20 17:06:21'),(65,522,'//TODO \n1.Redis全套 (Done)\n3.学成在线（14天） \n4.百度地图（14天） \n5.ruoyiPro（下学期手搓淘宝）',1,2,0,'2024-12-20 17:08:00','2024-12-20 17:08:00'),(66,522,'SpringCloud完结撒花❀❀❀',1,2,0,'2024-12-13 17:09:32','2024-12-20 17:09:34'),(67,522,'Great,学成在线启航',1,2,0,'2024-12-20 17:59:33','2024-12-20 17:59:34');
/*!40000 ALTER TABLE `blog_talk` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `blog_talk_photo`
--

DROP TABLE IF EXISTS `blog_talk_photo`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `blog_talk_photo` (
  `id` int NOT NULL AUTO_INCREMENT,
  `talk_id` int DEFAULT NULL COMMENT '说说的id',
  `url` varchar(255) DEFAULT NULL COMMENT '图片地址',
  `createdAt` datetime DEFAULT NULL,
  `updatedAt` datetime DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=119 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `blog_talk_photo`
--

LOCK TABLES `blog_talk_photo` WRITE;
/*!40000 ALTER TABLE `blog_talk_photo` DISABLE KEYS */;
INSERT INTO `blog_talk_photo` (`id`, `talk_id`, `url`, `createdAt`, `updatedAt`) VALUES (115,62,'http://so6b4f8dg.hn-bkt.clouddn.com/FhltcDFIQj2mYMR4VlY4W_o6ipKb','2024-12-09 09:01:41','2024-12-09 09:01:41'),(118,63,'http://so6b4f8dg.hn-bkt.clouddn.com/Fod1EmqD4qVcNKm529A6OrYIvVOj','2024-12-18 11:00:23','2024-12-18 11:00:23');
/*!40000 ALTER TABLE `blog_talk_photo` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `blog_user`
--

DROP TABLE IF EXISTS `blog_user`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `blog_user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL COMMENT '账号，唯一',
  `password` char(64) NOT NULL COMMENT '密码',
  `role` int NOT NULL DEFAULT '2' COMMENT '用户角色 1 管理员 2 普通用户',
  `nick_name` varchar(255) DEFAULT '' COMMENT '用户昵称',
  `avatar` varchar(255) DEFAULT '' COMMENT '用户头像',
  `createdAt` datetime DEFAULT NULL,
  `updatedAt` datetime DEFAULT NULL,
  `qq` varchar(255) DEFAULT '' COMMENT '用户QQ 用于联系',
  `ip` varchar(255) DEFAULT '' COMMENT 'ip属地',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `username` (`username`) USING BTREE,
  UNIQUE KEY `username_2` (`username`) USING BTREE,
  UNIQUE KEY `username_3` (`username`) USING BTREE,
  UNIQUE KEY `username_4` (`username`) USING BTREE,
  UNIQUE KEY `username_5` (`username`) USING BTREE,
  UNIQUE KEY `username_6` (`username`) USING BTREE,
  UNIQUE KEY `username_7` (`username`) USING BTREE,
  UNIQUE KEY `username_8` (`username`) USING BTREE,
  UNIQUE KEY `username_9` (`username`) USING BTREE,
  UNIQUE KEY `username_10` (`username`) USING BTREE,
  UNIQUE KEY `username_11` (`username`) USING BTREE,
  UNIQUE KEY `username_12` (`username`) USING BTREE,
  UNIQUE KEY `username_13` (`username`) USING BTREE,
  UNIQUE KEY `username_14` (`username`) USING BTREE,
  UNIQUE KEY `username_15` (`username`) USING BTREE,
  UNIQUE KEY `username_16` (`username`) USING BTREE,
  UNIQUE KEY `username_17` (`username`) USING BTREE,
  UNIQUE KEY `username_18` (`username`) USING BTREE,
  UNIQUE KEY `username_19` (`username`) USING BTREE,
  UNIQUE KEY `username_20` (`username`) USING BTREE,
  UNIQUE KEY `username_21` (`username`) USING BTREE,
  UNIQUE KEY `username_22` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=523 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=DYNAMIC;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `blog_user`
--

LOCK TABLES `blog_user` WRITE;
/*!40000 ALTER TABLE `blog_user` DISABLE KEYS */;
INSERT INTO `blog_user` (`id`, `username`, `password`, `role`, `nick_name`, `avatar`, `createdAt`, `updatedAt`, `qq`, `ip`) VALUES (522,'iojam','$2a$10$MBV9QdvkyoSQJQcP24ikMeRfd5P/ARovQYIXdost05we9RZk2wRky',1,'iojam','http://so6b4f8dg.hn-bkt.clouddn.com/Fj-f9JbVLt59lBwRb4P9Sk7s0P8j','2024-12-08 23:19:58','2024-12-20 17:00:16','','39.144.247.37');
/*!40000 ALTER TABLE `blog_user` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2024-12-20 18:23:28
